PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB`"""Class-based event handlers A light-weight event-handler framework based on event classes. Handlers are registered for event classes: >>> import zope.event.classhandler >>> class MyEvent(object): ... def __repr__(self): ... return self.__class__.__name__ >>> def handler1(event): ... print("handler1 %r" % event) >>> zope.event.classhandler.handler(MyEvent, handler1) Descriptor syntax: >>> @zope.event.classhandler.handler(MyEvent) ... def handler2(event): ... print("handler2 %r" % event) >>> class MySubEvent(MyEvent): ... pass >>> @zope.event.classhandler.handler(MySubEvent) ... def handler3(event): ... print("handler3 %r" % event) Subscribers are called in class method-resolution order, so only new-style event classes are supported, and then by order of registry. >>> import zope.event >>> zope.event.notify(MySubEvent()) handler3 MySubEvent handler1 MySubEvent handler2 MySubEvent """ import zope.event registry = {} def handler(event_class, handler_=None, decorator=False): """Define an event handler for a (new-style) class. This can be called with a class and a handler, or with just a class and the result used as a handler decorator. """ if handler_ is None: return lambda func: handler(event_class, func, True) if not registry: zope.event.subscribers.append(dispatch) if event_class not in registry: registry[event_class] = [handler_] else: registry[event_class].append(handler_) if decorator: return handler def dispatch(event): for event_class in event.__class__.__mro__: for handler in registry.get(event_class, ()): handler(event)