1 # Copyright (c) 2008 David Aguilar
2 """This module provides the Observable class"""
5 from cola
.compat
import set
7 class Observable(object):
8 """Handles subject/observer notifications."""
10 self
.observers
= set()
11 self
.message_observers
= {}
12 self
.notification_enabled
= True
14 def add_observer(self
, observer
):
15 """Adds an observer to this model"""
16 self
.observers
.add(observer
)
18 def add_message_observer(self
, message
, observer
):
19 """Add an observer for a specific message."""
20 observers
= self
.message_observers
.setdefault(message
, set())
21 observers
.add(observer
)
23 def remove_observer(self
, observer
):
24 """Remove an observer."""
25 if observer
in self
.observers
:
26 self
.observers
.remove(observer
)
27 for message
, observers
in self
.message_observers
.items():
28 if observer
in observers
:
29 observers
.remove(observer
)
31 def notify_observers(self
, *param
):
32 """Notifies observers about attribute changes"""
33 if not self
.notification_enabled
:
35 for observer
in self
.observers
:
36 observer
.notify(*param
)
38 def notify_message_observers(self
, message
, *args
, **opts
):
39 """Pythonic signals and slots."""
40 if not self
.notification_enabled
:
42 observers
= self
.message_observers
.get(message
, ())
43 for method
in observers
: