from weakref import ref __all__ = ['EventHub', 'Signal'] class EventHub(object): def __init__(self): self._events = {} def copy(self): new = self.__class__() new._events = self._events.copy() return new def listen(self, signal, listener, attr=None, weak=True): if weak: listener = ref(listener) else: listener = lambda l=listener: l self._events.setdefault(signal, []).append((listener, attr)) def send(self, signal, **kw): for listener, attr in self._events.get(signal, ()): l = listener() if l is not None: if attr is not None: l = getattr(l, attr) l(**kw) class _Signal(object): """ Base event for all SQLObject events. In general the sender for these methods is the class, not the instance. """ def __init__(self, class_name, bases, attrs): self.name = self.__name__ = class_name for name, value in attrs.items(): setattr(self, name, value) def __repr__(self): return '' % (self.name) Signal = _Signal('Signal', (), {})