1+ class CallbackBase :
2+ def __init__ (self ):
3+
4+ self .__callbackMap = {}
5+
6+ for k in (getattr (self , x ) for x in dir (self )):
7+ if hasattr (k , "bind_to_event" ):
8+ self .__callbackMap .setdefault (k .bind_to_event , []).append (k )
9+ elif hasattr (k , "bind_to_event_list" ):
10+ for j in k .bind_to_event_list :
11+ self .__callbackMap .setdefault (j , []).append (k )
12+
13+ ## staticmethod is only used to create a namespace
14+ @staticmethod
15+ def callback (event ):
16+
17+ def f (g , ev = event ):
18+ g .bind_to_event = ev
19+ return g
20+ return f
21+
22+ @staticmethod
23+ def callbacklist (eventlist ):
24+
25+ def f (g , evl = eventlist ):
26+ g .bind_to_event_list = evl
27+ return g
28+ return f
29+
30+ def dispatch (self , event ):
31+ l = self .__callbackMap [event ]
32+ f = lambda * args , ** kargs :\
33+ map (lambda x : x (* args , ** kargs ), l )
34+ return f
35+
36+ ## Sample
37+ class MyClass (CallbackBase ):
38+ EVENT1 = 1
39+ EVENT2 = 2
40+
41+ @CallbackBase .callback (EVENT1 )
42+ def handler1 (self , param = None ):
43+ print "handler1 with param: %s" % str (param )
44+ return None
45+
46+ @CallbackBase .callbacklist ([EVENT1 , EVENT2 ])
47+ def handler2 (self , param = None ):
48+ print "handler2 with param: %s" % str (param )
49+ return None
50+
51+ def run (self , event , param = None ):
52+ self .dispatch (event )(param )
53+
54+
55+ if __name__ == "__main__" :
56+ a = MyClass ()
57+ a .run (MyClass .EVENT1 , 'mandarina' )
58+ a .run (MyClass .EVENT2 , 'naranja' )
0 commit comments