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
28
29
30 """
31 __docformat__ = "restructuredtext en"
32
33 from types import ListType, TupleType
34
40
41
43 """Return true if the give object (maybe an instance or class) implements
44 the interface.
45 """
46 kimplements = getattr(obj, '__implements__', ())
47 if not isinstance(kimplements, (list, tuple)):
48 kimplements = (kimplements,)
49 for implementedinterface in kimplements:
50 if issubclass(implementedinterface, interface):
51 return True
52 return False
53
54
55 -def extend(klass, interface, _recurs=False):
56 """Add interface to klass'__implements__ if not already implemented in.
57
58 If klass is subclassed, ensure subclasses __implements__ it as well.
59
60 NOTE: klass should be e new class.
61 """
62 if not implements(klass, interface):
63 try:
64 kimplements = klass.__implements__
65 kimplementsklass = type(kimplements)
66 kimplements = list(kimplements)
67 except AttributeError:
68 kimplementsklass = tuple
69 kimplements = []
70 kimplements.append(interface)
71 klass.__implements__ = kimplementsklass(kimplements)
72 for subklass in klass.__subclasses__():
73 extend(subklass, interface, _recurs=True)
74 elif _recurs:
75 for subklass in klass.__subclasses__():
76 extend(subklass, interface, _recurs=True)
77