52 _toload[0][modname] = fileordir |
52 _toload[0][modname] = fileordir |
53 _toload[1].append((fileordir, modname)) |
53 _toload[1].append((fileordir, modname)) |
54 return _toload |
54 return _toload |
55 |
55 |
56 |
56 |
|
57 def classid(cls): |
|
58 """returns a unique identifier for an appobject class""" |
|
59 return '%s.%s' % (cls.__module__, cls.__name__) |
|
60 |
57 class Registry(dict): |
61 class Registry(dict): |
58 |
62 |
59 def __init__(self, config): |
63 def __init__(self, config): |
60 super(Registry, self).__init__() |
64 super(Registry, self).__init__() |
61 self.config = config |
65 self.config = config |
86 |
90 |
87 def register_and_replace(self, obj, replaced): |
91 def register_and_replace(self, obj, replaced): |
88 # XXXFIXME this is a duplication of unregister() |
92 # XXXFIXME this is a duplication of unregister() |
89 # remove register_and_replace in favor of unregister + register |
93 # remove register_and_replace in favor of unregister + register |
90 # or simplify by calling unregister then register here |
94 # or simplify by calling unregister then register here |
91 if hasattr(replaced, 'classid'): |
95 if not isinstance(replaced, basestring): |
92 replaced = replaced.classid() |
96 replaced = classid(replaced) |
93 registered_objs = self.get(obj.id, ()) |
97 registered_objs = self.get(obj.id, ()) |
94 for index, registered in enumerate(registered_objs): |
98 for index, registered in enumerate(registered_objs): |
95 if registered.classid() == replaced: |
99 if classid(registered) == replaced: |
96 del registered_objs[index] |
100 del registered_objs[index] |
97 break |
101 break |
98 else: |
102 else: |
99 self.warning('trying to replace an unregistered view %s by %s', |
103 self.warning('trying to replace an unregistered view %s by %s', |
100 replaced, obj) |
104 replaced, obj) |
101 self.register(obj) |
105 self.register(obj) |
102 |
106 |
103 def unregister(self, obj): |
107 def unregister(self, obj): |
104 oid = obj.classid() |
108 oid = classid(obj) |
105 for registered in self.get(obj.id, ()): |
109 for registered in self.get(obj.id, ()): |
106 # use classid() to compare classes because vreg will probably |
110 # use classid() to compare classes because vreg will probably |
107 # have its own version of the class, loaded through execfile |
111 # have its own version of the class, loaded through execfile |
108 if registered.classid() == oid: |
112 if classid(registered) == oid: |
109 # XXX automatic reloading management |
113 # XXX automatic reloading management |
110 self[obj.id].remove(registered) |
114 self[obj.id].remove(registered) |
111 break |
115 break |
112 else: |
116 else: |
113 self.warning('can\'t remove %s, no id %s in the registry', |
117 self.warning('can\'t remove %s, no id %s in the registry', |