Package logilab :: Package common :: Module interface
[frames] | no frames]

Source Code for Module logilab.common.interface

 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   
18 -class Interface(object):
19 """Base class for interfaces."""
20 - def is_implemented_by(cls, instance):
21 return implements(instance, cls)
22 is_implemented_by = classmethod(is_implemented_by)
23 24
25 -def implements(obj, interface):
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