Source code for alarmdecoder.event.event
# 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.
[docs]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
[docs]class EventHandler(object):
def __init__(self, event, obj):
self.event = event
self.obj = obj
def __iter__(self):
return iter(self._getfunctionlist())
def _getfunctionlist(self):
"""(internal use) """
try:
eventhandler = self.obj.__eventhandler__
except AttributeError:
eventhandler = self.obj.__eventhandler__ = {}
return eventhandler.setdefault(self.event, [])
[docs] 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
[docs] def remove(self, func):
"""Remove existing event handler function.
You can remove handler also by using '-=' operator.
"""
self._getfunctionlist().remove(func)
return self
[docs] 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