1 """Bases class for interfaces to provide 'light' interface handling.
2
3 TODO:
4 _ implements a check method which check that an object implements the
5 interface
6 _ Attribute objects
7
8 This module requires at least python 2.2
9
10 :copyright: 2000-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
11 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
12 :license: General Public License version 2 - http://www.gnu.org/licenses
13 """
14 __docformat__ = "restructuredtext en"
15
16 from types import ListType, TupleType
17
23
24
26 """Return true if the give object (maybe an instance or class) implements
27 the interface.
28 """
29 kimplements = getattr(obj, '__implements__', ())
30 if not isinstance(kimplements, (list, tuple)):
31 kimplements = (kimplements,)
32 for implementedinterface in kimplements:
33 if issubclass(implementedinterface, interface):
34 return True
35 return False
36
37
38 -def extend(klass, interface, _recurs=False):
39 """Add interface to klass'__implements__ if not already implemented in.
40
41 If klass is subclassed, ensure subclasses __implements__ it as well.
42
43 NOTE: klass should be e new class.
44 """
45 if not implements(klass, interface):
46 try:
47 kimplements = klass.__implements__
48 kimplementsklass = type(kimplements)
49 kimplements = list(kimplements)
50 except AttributeError:
51 kimplementsklass = tuple
52 kimplements = []
53 kimplements.append(interface)
54 klass.__implements__ = kimplementsklass(kimplements)
55 for subklass in klass.__subclasses__():
56 extend(subklass, interface, _recurs=True)
57 elif _recurs:
58 for subklass in klass.__subclasses__():
59 extend(subklass, interface, _recurs=True)
60