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)