Revision: 597
http://fclient.svn.sourceforge.net/fclient/?rev=597&view=rev
Author: jUrner
Date: 2008-07-12 12:57:57 -0700 (Sat, 12 Jul 2008)
Log Message:
-----------
weakref observers
Modified Paths:
--------------
trunk/fclient/src/fclient/lib/fcp2/lib/events.py
Modified: trunk/fclient/src/fclient/lib/fcp2/lib/events.py
===================================================================
--- trunk/fclient/src/fclient/lib/fcp2/lib/events.py 2008-07-12 19:57:33 UTC (rev 596)
+++ trunk/fclient/src/fclient/lib/fcp2/lib/events.py 2008-07-12 19:57:57 UTC (rev 597)
@@ -1,5 +1,6 @@
"""Signals and events"""
+import weakref
#*********************************************************************
#
#*********************************************************************
@@ -81,7 +82,8 @@
"""Event class
@ivar name: name of the event
- @ivar observers: observers listening to the event
+ @note: only a weak reference is kept observers to automatically remove observers when
+ the observer is no longer alive
>>> event = Event('myEventsName')
>>> event.name
@@ -101,40 +103,41 @@
@param name: name of the event
"""
self.name = name
- self.observers = []
+ self._refs = []
+
def __call__(self, *args, **kwargs):
"""Dispatches the event and additional parameters to all observers registerd
@note: all listeners will be called with the event a first parameter, followed
by optional args and kwargs
"""
- for observer in self.observers:
- observer(self, *args, **kwargs)
-
- def __contains__(self, observer):
- """Checks if an observer is aleady registered
- @return: bool
- """
- return observer in self.observers
-
+ for ref in self._refs:
+ observer = ref()
+ if ref is not None:
+ observer(self, *args, **kwargs)
+
def __iadd__(self, observer):
"""Adds an observer to the event
@note: the observer will be called with the event as first paraeter,
followed by any number of *args or **kwargs passed by the caller of an event
"""
- self.observers.append(observer)
+ self._refs.append(weakref.ref(observer, self.handleDereference))
return self
def __isub__(self, observer):
"""Removes the first occurence of an observer from the event"""
- self.observers.remove(observer)
+ observers = [i() for i in self._refs]
+ del self._refs[observers.index(observer)]
return self
+
+ def handleDereference(self, ref):
+ self._refs.remove(ref)
#*********************************************************************
#
#*********************************************************************
if __name__ == '__main__':
import doctest
- doctest.testmod()
+ print 'doctests failed: %s/%s' % doctest.testmod()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|