202 def values(self): |
202 def values(self): |
203 return self._registries.values() |
203 return self._registries.values() |
204 |
204 |
205 def __contains__(self, key): |
205 def __contains__(self, key): |
206 return key in self._registries |
206 return key in self._registries |
207 |
207 |
|
208 |
|
209 ########## |
|
210 def register(self, obj, registryname=None): |
|
211 registryname = registryname or obj.__registry__ |
|
212 registry = self._registries.setdefault(registryname, {}) |
|
213 registry.setdefault(obj.id, []).append(obj) |
|
214 # XXX automatic reloading management |
|
215 self._registered['%s.%s' % (obj.__module__, obj.id)] = obj |
|
216 |
|
217 def register_if_interface_found(self, obj, registryname, iface): |
|
218 registry = self._registries.setdefault(registryname, {}) |
|
219 for etype in self.registry_object('etypes'): |
|
220 if implements(etype, iface): |
|
221 registry.setdefault(obj.id, []).append(obj) |
|
222 # XXX automatic reloading management |
|
223 self._registered['%s.%s' % (obj.__module__, obj.id)] = obj |
|
224 break |
|
225 |
|
226 def unregister(self, obj, registryname=None): |
|
227 registryname = registryname or obj.__registry__ |
|
228 registry = self.registry(registryname) |
|
229 removed_id = obj.classid() |
|
230 for registered in registry[obj.id]: |
|
231 # use classid() to compare classes because vreg will probably |
|
232 # have its own version of the class, loaded through execfile |
|
233 if registered.classid() == removed_id: |
|
234 # XXX automatic reloading management |
|
235 registry[obj.id].remove(registered) |
|
236 break |
|
237 |
|
238 def register_and_replace(self, obj, replaced, registryname=None): |
|
239 registryname = registryname or obj.__registry__ |
|
240 registry = self.registry(registryname) |
|
241 registered_objs = registry[obj.id] |
|
242 for index, registered in enumerate(registered_objs): |
|
243 if registered.classid() == replaced: |
|
244 registry[obj.id][index] = obj |
|
245 self._registered['%s.%s' % (obj.__module__, obj.id)] = obj |
|
246 ########## |
|
247 |
208 def register_vobject_class(self, cls, _kicked=set()): |
248 def register_vobject_class(self, cls, _kicked=set()): |
209 """handle vobject class registration |
249 """handle vobject class registration |
210 |
250 |
211 vobject class with __abstract__ == True in their local dictionnary or |
251 vobject class with __abstract__ == True in their local dictionnary or |
212 with a name starting starting by an underscore are not registered. |
252 with a name starting starting by an underscore are not registered. |
471 self.update_registered_subclasses(oldnew_mapping) |
511 self.update_registered_subclasses(oldnew_mapping) |
472 _lastmodifs[filepath] = modified_on |
512 _lastmodifs[filepath] = modified_on |
473 return True |
513 return True |
474 |
514 |
475 def load_module(self, module): |
515 def load_module(self, module): |
476 registered = {} |
516 if hasattr(module, 'cw_register_objects'): |
477 self.info('loading %s', module) |
517 self._registered = {} |
478 for objname, obj in vars(module).items(): |
518 module.cw_register_objects(self) |
479 if objname.startswith('_'): |
519 registered = self._resigtered |
480 continue |
520 del self._registered |
481 self.load_ancestors_then_object(module.__name__, registered, obj) |
521 return registered |
482 return registered |
522 else: |
|
523 registered = {} |
|
524 self.info('loading %s', module) |
|
525 for objname, obj in vars(module).items(): |
|
526 if objname.startswith('_'): |
|
527 continue |
|
528 self.load_ancestors_then_object(module.__name__, registered, obj) |
|
529 return registered |
483 |
530 |
484 def load_ancestors_then_object(self, modname, registered, obj): |
531 def load_ancestors_then_object(self, modname, registered, obj): |
485 # skip imported classes |
532 # skip imported classes |
486 if getattr(obj, '__module__', None) != modname: |
533 if getattr(obj, '__module__', None) != modname: |
487 return |
534 return |