Source code for ascii_designer.event

'''Provides an event dispatcher class.
'''

# Bells and whistles that could be added:
# - signature check
# - description

___all__ = [
    'EventSource',
    'CancelEvent',

]

[docs]class CancelEvent(Exception): '''Raise this in an event handler to inhibit all further processing.'''
[docs]class EventSource: '''Event dispatcher class You can register / unregister handlers via ``+=`` and ``-=`` methods. Handlers *may* return a result. If multiple handlers return results, last one is returned to the event's source. ''' def __init__(self): self._handlers = [] def __iadd__(self, handler): self._handlers.append(handler) return self def __isub__(self, handler): self._handlers.remove(handler) return self def __call__(self, *args, **kwargs): '''Trigger the event. To be called by the event's owner.''' all_result = None for handler in self._handlers: try: result = handler(*args, **kwargs) except CancelEvent: break if result is not None: all_result = result return all_result