1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """Bases class for interfaces to provide 'light' interface handling.
19
20 TODO:
21 _ implements a check method which check that an object implements the
22 interface
23 _ Attribute objects
24
25 This module requires at least python 2.2
26 """
27 __docformat__ = "restructuredtext en"
28
29
35
36
38 """Return true if the give object (maybe an instance or class) implements
39 the interface.
40 """
41 kimplements = getattr(obj, '__implements__', ())
42 if not isinstance(kimplements, (list, tuple)):
43 kimplements = (kimplements,)
44 for implementedinterface in kimplements:
45 if issubclass(implementedinterface, interface):
46 return True
47 return False
48
49
50 -def extend(klass, interface, _recurs=False):
51 """Add interface to klass'__implements__ if not already implemented in.
52
53 If klass is subclassed, ensure subclasses __implements__ it as well.
54
55 NOTE: klass should be e new class.
56 """
57 if not implements(klass, interface):
58 try:
59 kimplements = klass.__implements__
60 kimplementsklass = type(kimplements)
61 kimplements = list(kimplements)
62 except AttributeError:
63 kimplementsklass = tuple
64 kimplements = []
65 kimplements.append(interface)
66 klass.__implements__ = kimplementsklass(kimplements)
67 for subklass in klass.__subclasses__():
68 extend(subklass, interface, _recurs=True)
69 elif _recurs:
70 for subklass in klass.__subclasses__():
71 extend(subklass, interface, _recurs=True)
72