0001class ClassRegistry(object):
0002
0003 def __init__(self, name):
0004 self.name = name
0005 self._classes = {}
0006 self._callbacks = {}
0007
0008 def _resolve_name(self, classname, relative_to):
0009 parts = classname.split('.')
0010 classname = parts[-1]
0011 module = '.'.join(parts[:-1])
0012 if not module:
0013 module = relative_to
0014 return module, classname
0015
0016 def register(self, cls):
0017 module, classname = (cls.__module__, cls.__name__)
0018 self._classes[(module, classname)] = cls
0019 if (module, classname) in self._callbacks:
0020 for func in self._callbacks[(module, classname)]:
0021 func(cls)
0022 del self._callbacks[(module, classname)]
0023
0024 def get_class(self, classname, relative_to=None):
0025 module, classname = self._resolve_name(classname, relative_to)
0026 return self._classes[(module, classname)]
0027
0028 def register_callback(self, callback, classname, relative_to=None):
0029 module, classname = self._resolve_name(classname, relative_to)
0030 if (module, classname) in self._classes:
0031 callback(self._classes[(module, classname)])
0032 else:
0033 self._callbacks.setdefault((module, classname), []).append(
0034 callback)