Package elisa :: Package core :: Package observers :: Module observable
[hide private]
[frames] | no frames]

Source Code for Module elisa.core.observers.observable

 1  # -*- coding: utf-8 -*- 
 2  # Elisa - Home multimedia server 
 3  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
 4  # All rights reserved. 
 5  # 
 6  # This file is available under one of two license agreements. 
 7  # 
 8  # This file is licensed under the GPL version 3. 
 9  # See "LICENSE.GPL" in the root of this distribution including a special 
10  # exception to use Elisa with Fluendo's plugins. 
11  # 
12  # The GPL part of Elisa is also available under a commercial licensing 
13  # agreement from Fluendo. 
14  # See "LICENSE.Elisa" in the root directory of this distribution package 
15  # for details on that license. 
16   
17   
18  __maintainer__ = 'Florian Boucault <florian@fluendo.com>' 
19   
20  import weakref 
21   
22  from elisa.core import log 
23   
24 -class Observable(log.Loggable):
25 """Observable objects can be observed by multiple 26 L{elisa.core.observers.observer.Observer} instances, each of them 27 getting notified of any changes occuring to the former. 28 """ 29 30 # weak references to the observers 31 _observers = [] 32
33 - def __init__(self):
34 super(Observable, self).__init__() 35 self._observers = []
36
37 - def add_observer(self, observer):
38 """Attach an observer which will then be notified of all the changes 39 applied to the observable. 40 41 @param observer: observer to attach 42 @type observer: L{elisa.core.observers.observer.Observer} 43 """ 44 self.debug("Adding observer %r" % observer) 45 real_observers = [weak_observer() for weak_observer in self._observers] 46 if observer not in real_observers: 47 self._observers.append(weakref.ref(observer)) 48 else: 49 self.debug("Observer %r was already observing" % observer)
50
51 - def remove_observer(self, observer):
52 """Detach an observer which will not be notified anymore of changes 53 applied to the observable. 54 55 @param observer: observer to detach 56 @type observer: L{elisa.core.observers.observer.Observer} 57 """ 58 self.debug("Removing observer %r", observer) 59 refs = weakref.getweakrefs(observer) 60 for ref in refs: 61 try: 62 self._observers.remove(ref) 63 except ValueError: 64 pass 65 """ 66 # ignore the call if the observer was not known 67 self.debug("Observer %r was not observing", observer) 68 """
69
70 - def __setattr__(self, key, new_value):
71 try: 72 old_value = getattr(self, key) 73 except: 74 old_value = None 75 76 # setattr() not usable because it would result in a recursion loop 77 super(Observable, self).__setattr__(key, new_value) 78 79 # ignore private attributes (those starting with '_') 80 if key[0] != '_': 81 # notifies all the attached observers 82 self._send_message_to_observers("attribute_set", self, key, 83 old_value, new_value)
84
85 - def _send_message_to_observers(self, message, *args):
86 for weak_observer in self._observers: 87 observer = weak_observer() 88 if observer == None: 89 continue 90 else: 91 getattr(observer, message)(*args)
92