tools.py

changeset 35
3b7a38af5c42
child 36
cb4124e3e75b
equal deleted inserted replaced
34:022e881b758e 35:3b7a38af5c42
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))

mercurial