- This method may be
- called multiple times for one listener, registering it with
- many topics. It can also be invoked many times for a
- particular topic, each time with a different listener.
- See the class doc for requirements on listener and topic.
-
+ This method may be called multiple times for one listener,
+ registering it with many topics. It can also be invoked many
+ times for a particular topic, each time with a different
+ listener. See the class doc for requirements on listener and
+ topic.
+
+ :note: The listener is held by Publisher() only by *weak* reference.
+ This means you must ensure you have at least one strong reference
+ to listener, otherwise it will be DOA ("dead on arrival"). This is
+ particularly easy to forget when wrapping a listener method in a
+ proxy object (e.g. to bind some of its parameters), e.g.
+
+ :code:
+ class Foo:
+ def listener(self, event): pass
+ class Wrapper:
+ def __init__(self, fun): self.fun = fun
+ def __call__(self, *args): self.fun(*args)
+ foo = Foo()
+ Publisher().subscribe( Wrapper(foo.listener) ) # whoops: DOA!
+ wrapper = Wrapper(foo.listener)
+ Publisher().subscribe(wrapper) # good!
+