diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-07-24 13:19:59 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-07-24 13:19:59 -0400 |
| commit | 8a7ae371535342bb35491d59aaa1131ba7c435fa (patch) | |
| tree | 23794b40afd01c275a2831361c19a02bd4cd388e /lib/sqlalchemy/event.py | |
| parent | 8e0618aa650c43b483dbae443ddca94fcdd5b945 (diff) | |
| download | sqlalchemy-8a7ae371535342bb35491d59aaa1131ba7c435fa.tar.gz | |
- initial "events" idea. will replace all Extension, Proxy, Listener
implementations with a single interface.
Diffstat (limited to 'lib/sqlalchemy/event.py')
| -rw-r--r-- | lib/sqlalchemy/event.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/sqlalchemy/event.py b/lib/sqlalchemy/event.py new file mode 100644 index 000000000..1b0b62b34 --- /dev/null +++ b/lib/sqlalchemy/event.py @@ -0,0 +1,44 @@ +from sqlalchemy import util + +def listen(fn, identifier, target, *args): + """Listen for events, passing to fn.""" + + target._dispatch.append(fn, identifier, target, *args) + +NO_RESULT = util.symbol('no_result') + + +class Dispatch(object): + + def append(self, identifier, fn, target): + getattr(self, identifier).append(fn) + + def __getattr__(self, key): + self.__dict__[key] = coll = [] + return coll + + def chain(self, identifier, chain_kw, **kw): + ret = NO_RESULT + for fn in getattr(self, identifier): + ret = fn(**kw) + kw['chain_kw'] = ret + return ret + + def __call__(self, identifier, **kw): + for fn in getattr(self, identifier): + fn(**kw) + + +class dispatcher(object): + def __init__(self, dispatch_cls=Dispatch): + self.dispatch_cls = dispatch_cls + self._dispatch = dispatch_cls() + + def __get__(self, obj, cls): + if obj is None: + return self._dispatch + obj.__dict__['_dispatch'] = disp = self.dispatch_cls() + for key in self._dispatch.__dict__: + if key.startswith('on_'): + disp.__dict__[key] = self._dispatch.__dict__[k].copy() + return disp |
