1class Signals(object):
2    def __init__(self):
3        self._signals = {}
4
5    def _connect(self, obj, name, handler, connector):
6        ret = self._signals.setdefault(obj, {})
7
8        hid = connector(name, handler)
9        ret.setdefault(name, []).append(hid)
10
11        return hid
12
13    def connect_signal(self, obj, name, handler):
14        return self._connect(obj, name, handler, obj.connect)
15
16    def connect_signal_after(self, obj, name, handler):
17        return self._connect(obj, name, handler, obj.connect_after)
18
19    def disconnect_signals(self, obj):
20        if obj not in self._signals:
21            return False
22
23        for name in self._signals[obj]:
24            for hid in self._signals[obj][name]:
25                obj.disconnect(hid)
26
27        del self._signals[obj]
28        return True
29
30    def block_signal(self, obj, name):
31        if obj not in self._signals:
32            return False
33
34        if name not in self._signals[obj]:
35            return False
36
37        for hid in self._signals[obj][name]:
38            obj.handler_block(hid)
39
40        return True
41
42    def unblock_signal(self, obj, name):
43        if obj not in self._signals:
44            return False
45
46        if name not in self._signals[obj]:
47            return False
48
49        for hid in self._signals[obj][name]:
50            obj.handler_unblock(hid)
51
52        return True
53
54    def disconnect_signal(self, obj, name):
55        if obj not in self._signals:
56            return False
57
58        if name not in self._signals[obj]:
59            return False
60
61        for hid in self._signals[obj][name]:
62            obj.disconnect(hid)
63
64        del self._signals[obj][name]
65
66        if len(self._signals[obj]) == 0:
67            del self._signals[obj]
68
69        return True