class Observable: @staticmethod def create(source, parent=None, key=None): from . import ObservableDict from . import ObservableList if isinstance(source, ObservableDict) or isinstance(source, ObservableList): source.parent = parent source.key = key return source if isinstance(source, dict): return ObservableDict(source, parent, key) if isinstance(source, list): return ObservableList(source, parent, key) else: return source def __init__(self, parent, key): self.parent = parent self.key = key self.subscriptions = [] def subscribe(self, handler, immediate=False): self.subscriptions.append(handler) if immediate: handler(self, []) def notify(self, keys=None): if keys is None: keys = [] for s in self.subscriptions: s(self, keys) if self.parent is not None: if self.key is None: raise ValueError keys.insert(0, self.key) self.parent.notify(keys)