Added TODO and DEVELOPMENT.
[faces-project.git] / metapie / events.py
blobf1dc4c54caacca1d1cae8f30c78ab80fd8c59391
1 ############################################################################
2 # Copyright (C) 2005 by Reithinger GmbH
3 # mreithinger@web.de
5 # This file is part of metapie.
6 #
7 # metapie is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
12 # pyplan is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the
19 # Free Software Foundation, Inc.,
20 # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 ############################################################################
23 import weakref
24 try:
25 set
26 except NameError:
27 from sets import Set as set
30 class Subject(object):
31 #no __init__ because auf ZODB
32 #Subjects attributes are transient
33 #and must be created on the flow
35 def detach_all(self):
36 try:
37 del self._v_observers
38 except AttributeError: pass
41 def attach(self, callback, event="default"):
42 try:
43 observers = self._v_observers
44 except AttributeError:
45 observers = self._v_observers = { }
47 ol = observers.get(event)
48 if not ol: ol = observers[event] = set()
49 ol.add(callback)
52 def attach_weak(self, callback, event="default"):
53 self.attach(weakref.ref(callback, self.__detach_weak), event)
56 def __detach_weak(self, callback):
57 self.detach(callback)
60 def detach(self, callback=None, event=None):
61 try:
62 observers = self._v_observers
63 except AttributeError:
64 observers = self._v_observers = { }
66 if callback is None: observers.clear()
68 def detach_event(ol, callback):
69 try:
70 if ol: ol.remove(callback)
71 except KeyError:
72 pass
74 if event:
75 detach_event(observers.get(event), callback)
76 else:
77 for ol in observers.itervalues():
78 detach_event(ol, callback)
82 def fire(self, event="default", *args, **kwargs):
83 try:
84 observers = self._v_observers
85 except AttributeError:
86 return
88 try:
89 if self._v_events_disabled: return
90 except AttributeError:
91 pass
93 for cb in self._v_observers.get(event, ()):
94 if type(cb) == weakref.ReferenceType:
95 cb = cb()
96 if cb: cb(*args, **kwargs)
97 else:
98 cb(*args, **kwargs)
101 def disable_events():
102 try:
103 self._v_events_disabled += 1
104 except AttributeError:
105 self._v_events_disabled = 1
108 def enable_events():
109 self._v_events_disabled -= 1
112 if __name__ == "__main__":
113 def test():
114 sender = Subject()
116 def call_me():
117 print "call me"
119 print "before attach"
120 sender.attach_weak(call_me)
122 print "after attach"
124 sender.fire()
126 print "end"
129 test()