# event.py (improved) # # Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html # # License: https://creativecommons.org/licenses/by/2.1/jp/deed.en # # Changes: # * Added type check in fire() # * Removed earg from fire() and added support for args/kwargs. class Event(object): def __init__(self, doc=None): self.__doc__ = doc def __get__(self, obj, objtype=None): if obj is None: return self return EventHandler(self, obj) def __set__(self, obj, value): pass class EventHandler(object): def __init__(self, event, obj): self.event = event self.obj = obj def _getfunctionlist(self): """(internal use) """ try: eventhandler = self.obj.__eventhandler__ except AttributeError: eventhandler = self.obj.__eventhandler__ = {} return eventhandler.setdefault(self.event, []) def add(self, func): """Add new event handler function. Event handler function must be defined like func(sender, earg). You can add handler also by using '+=' operator. """ self._getfunctionlist().append(func) return self def remove(self, func): """Remove existing event handler function. You can remove handler also by using '-=' operator. """ self._getfunctionlist().remove(func) return self def fire(self, *args, **kwargs): """Fire event and call all handler functions You can call EventHandler object itself like e(*args, **kwargs) instead of e.fire(*args, **kwargs). """ for func in self._getfunctionlist(): if type(func) == EventHandler: func.fire(*args, **kwargs) else: func(self.obj, *args, **kwargs) __iadd__ = add __isub__ = remove __call__ = fire