class ClassRegistry(object): def __init__(self, name): self.name = name self._classes = {} self._callbacks = {} def _resolve_name(self, classname, relative_to): parts = classname.split('.') classname = parts[-1] module = '.'.join(parts[:-1]) if not module: module = relative_to return module, classname def register(self, cls): module, classname = (cls.__module__, cls.__name__) self._classes[(module, classname)] = cls if (module, classname) in self._callbacks: for func in self._callbacks[(module, classname)]: func(cls) del self._callbacks[(module, classname)] def get_class(self, classname, relative_to=None): module, classname = self._resolve_name(classname, relative_to) return self._classes[(module, classname)] def register_callback(self, callback, classname, relative_to=None): module, classname = self._resolve_name(classname, relative_to) if (module, classname) in self._classes: callback(self._classes[(module, classname)]) else: self._callbacks.setdefault((module, classname), []).append( callback)