|
1 class AbstractRegister(object): |
|
2 _instance = None |
|
3 _registered_type = None |
|
4 def __new__(cls): |
|
5 # implements a singleton |
|
6 if cls._instance is None: |
|
7 #debug('Instanciating %s', cls.__name__) |
|
8 cls._instance = super(AbstractRegister, cls).__new__(cls) |
|
9 cls._instance.registered = {} |
|
10 cls._instance.accepts = set() |
|
11 return cls._instance |
|
12 |
|
13 def add(self, cls): |
|
14 assert issubclass(cls, self._registered_type) |
|
15 if cls is self._registered_type: |
|
16 return |
|
17 if cls._accepts is None: |
|
18 return |
|
19 #assert isinstance(cls._accepts, (basestring, tuple)) |
|
20 |
|
21 #debug("Registerered %s for %s", cls.__name__) |
|
22 if not isinstance(cls._accepts, tuple): |
|
23 cls._accepts = (cls._accepts,) |
|
24 for key in cls._accepts: |
|
25 key = self._get_typ(key) |
|
26 #debug(" new key = %s", key) |
|
27 self.registered.setdefault(key, []).append(cls) |
|
28 self.accepts.add(key) |
|
29 |
|
30 def _get_typ(self, typ): |
|
31 if not isinstance(typ, basestring): |
|
32 if not isinstance(typ, type): |
|
33 return None |
|
34 typ = typ.__name__ |
|
35 return typ |
|
36 |
|
37 def __contains__(self, val): |
|
38 val = self._get_typ(val) |
|
39 return val in self.accepts |
|
40 |
|
41 def get_class(self, typ): |
|
42 item = typ |
|
43 if not isinstance(typ, type): |
|
44 typ = typ.__class__ |
|
45 name = typ.__name__ |
|
46 #debug("Looking a widget for %s", typ.__name__) |
|
47 orig_typ = typ |
|
48 while typ is not None: |
|
49 if typ.__name__ in self.registered: |
|
50 for w in self.registered[typ.__name__]: |
|
51 if w._filter is None or w._filter(item): |
|
52 #debug("Widget for %s is %s", typ.__name__, w) |
|
53 return w#self.registered[typ.__name__] |
|
54 if typ.__bases__: |
|
55 typ = typ.__bases__[0] |
|
56 if typ == object: |
|
57 typ = None |
|
58 elif typ.__name__ in ("ObjectItem_", "AbstractListItem_"): |
|
59 typ = orig_typ._type |
|
60 else: |
|
61 typ = None |
|
62 raise ValueError('No registered class for %s' % (name)) |