1 ############################################################################
2 # Copyright (C) 2005 by Reithinger GmbH
5 # This file is part of metapie.
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 ############################################################################
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
38 except AttributeError: pass
41 def attach(self
, callback
, event
="default"):
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()
52 def attach_weak(self
, callback
, event
="default"):
53 self
.attach(weakref
.ref(callback
, self
.__detach
_weak
), event
)
56 def __detach_weak(self
, callback
):
60 def detach(self
, callback
=None, event
=None):
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
):
70 if ol
: ol
.remove(callback
)
75 detach_event(observers
.get(event
), callback
)
77 for ol
in observers
.itervalues():
78 detach_event(ol
, callback
)
82 def fire(self
, event
="default", *args
, **kwargs
):
84 observers
= self
._v
_observers
85 except AttributeError:
89 if self
._v
_events
_disabled
: return
90 except AttributeError:
93 for cb
in self
._v
_observers
.get(event
, ()):
94 if type(cb
) == weakref
.ReferenceType
:
96 if cb
: cb(*args
, **kwargs
)
101 def disable_events():
103 self
._v
_events
_disabled
+= 1
104 except AttributeError:
105 self
._v
_events
_disabled
= 1
109 self
._v
_events
_disabled
-= 1
112 if __name__
== "__main__":
119 print "before attach"
120 sender
.attach_weak(call_me
)