vregistry.py
changeset 2821 526f44213b70
parent 2820 66b31686d92b
child 2829 054a8805da52
equal deleted inserted replaced
2820:66b31686d92b 2821:526f44213b70
    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',