Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / pyqt / gui / adapt.py
1 class AdaptationError(TypeError):
2         pass
3 class LiskovViolation(AdaptationError):
4         pass
5
6 _adapter_factory_registry = {}
7
8 def registerAdapterFactory(objtype, protocol, factory):
9         _adapter_factory_registry[objtype, protocol] = factory
10
11 def unregisterAdapterFactory(objtype, protocol):
12         del _adapter_factory_registry[objtype, protocol]
13
14 def _adapt_by_registry(obj, protocol, alternate):
15         factory = _adapter_factory_registry.get((type(obj), protocol))
16         if factory is None:
17             adapter = alternate
18         else:
19             adapter = factory(obj, protocol, alternate)
20         if adapter is AdaptationError:
21             raise AdaptationError,obj
22         else:
23             return adapter
24
25
26 def adapt(obj, protocol, alternate=AdaptationError):
27
28         t = type(obj)
29
30         # (a) first check to see if object has the exact protocol
31         if t is protocol:
32            return obj
33
34         try:
35             # (b) next check if t.__conform__ exists & likes protocol
36             conform = getattr(t, '__conform__', None)
37             if conform is not None:
38                 result = conform(obj, protocol)
39                 if result is not None:
40                     return result
41
42             # (c) then check if protocol.__adapt__ exists & likes obj
43             adapt = getattr(type(protocol), '__adapt__', None)
44             if adapt is not None:
45                 result = adapt(protocol, obj)
46                 if result is not None:
47                     return result
48         except LiskovViolation:
49             pass
50         else:
51             # (d) check if object is instance of protocol
52             try:
53                if isinstance(obj, protocol):
54                    return obj
55             except:
56                pass
57
58         # (e) last chance: try the registry
59         return _adapt_by_registry(obj, protocol, alternate)