Klar:
Code: Alles auswählen
class EventManager(type):
db = {}
def __new__(cls, name, bases, d):
event = type.__new__(cls, name, bases, d)
event_type = bases[0]
if not event_type is object and not event_type is Event:
if not event_type in EventManager.db:
EventManager.db[event_type] = []
EventManager.db[event_type].append(event)
return event
class EventCollection(object):
def __init__(self, event_type, attr):
self.event_type = event_type
self.attr = attr
def __call__(self, *args, **kwargs):
for event in EventManager.db.get(self.event_type, []):
getattr(event(), self.attr)(*args, **kwargs)
class ExtensionPoint(object):
def __init__(self, event_type):
self.event_type = event_type
def __getattr__(self, attr):
handler = 'on_%s' % attr
def proxy(*args, **kwargs):
for event in EventManager.db.get(self.event_type, []):
getattr(event(), handler)(*args, **kwargs)
if hasattr(self.event_type, handler):
return proxy
class Event(object):
__metaclass__ = EventManager
Nutzen kannst du es so:
Code: Alles auswählen
class TestEvent(Event):
def on_test_call(self, name):
"""gets called from the application."""
class NameOutput(TestEvent):
def on_test_call(self, name):
print "Your name is", name
class NameTest(TestEvent):
def on_test_call(self, name):
if name == 'foobar':
print 'This is NOT a name!!!'
class Application(object):
some_events = ExtensionPoint(TestEvent)
def __init__(self):
pass
def run(self):
name = raw_input("Enter your name: ")
self.some_events.test_call(name)
app = Application()
app.run()
Have fun
