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