1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """abstract data types with built-in notification support
23 """
24
25 __version__ = "$Rev: 7162 $"
26
27
29
30 class Watched(type):
31
32 def __init__(self):
33 type.__init__(self)
34 self.watch_id = 0
35 self.watch_procs = {}
36
37 def watch(self, proc):
38 self.watch_id += 1
39 self.watch_procs[self.watch_id] = proc
40 return self.watch_id
41
42 def unwatch(self, id):
43 del self.watch_procs[id]
44
45 def notify_changed(self):
46 for proc in self.watch_procs.values():
47 proc(self)
48
49 def mutate(method):
50
51 def do_mutate(self, *args, **kwargs):
52 method(self, *args, **kwargs)
53 self.notify_changed()
54 setattr(Watched, method.__name__, do_mutate)
55 for i in mutators:
56 mutate(getattr(type, i))
57
58 return Watched
59
60 WatchedList = _make_watched(list, 'append', 'insert', 'remove', 'pop',
61 'sort', 'reverse')
62 WatchedDict = _make_watched(dict, '__setitem__', '__delitem__', 'pop',
63 'popitem', 'update')
64