def unregister_class(alias): """ Opposite of L{register_class}. @raise UnknownClassAlias: Unknown alias. """ try: x = CLASS_CACHE[alias] except KeyError: raise UnknownClassAlias('Unknown alias %r' % (alias, )) if not x.anonymous: del CLASS_CACHE[x.alias] del CLASS_CACHE[x.klass] return x
def get_class_alias(klass_or_alias): """ Finds the L{ClassAlias} that is registered to C{klass_or_alias}. If a string is supplied and no related L{ClassAlias} is found, the alias is loaded via L{load_class}. @raise UnknownClassAlias: Unknown alias """ if isinstance(klass_or_alias, python.str_types): try: return CLASS_CACHE[klass_or_alias] except KeyError: return load_class(klass_or_alias) try: return CLASS_CACHE[klass_or_alias] except KeyError: raise UnknownClassAlias('Unknown alias for %r' % (klass_or_alias, ))
def flex_loader(alias): """ Loader for L{Flex<pyamf.flex>} framework compatibility classes. @raise UnknownClassAlias: Trying to load an unknown Flex compatibility class. """ if not alias.startswith('flex.'): return try: if alias.startswith('flex.messaging.messages'): import pyamf.flex.messaging elif alias.startswith('flex.messaging.io'): import pyamf.flex elif alias.startswith('flex.data.messages'): import pyamf.flex.data return CLASS_CACHE[alias] except KeyError: raise UnknownClassAlias(alias)
def load_class(alias): """ Finds the class registered to the alias. The search is done in order: 1. Checks if the class name has been registered via L{register_class} or L{register_package}. 2. Checks all functions registered via L{register_class_loader}. 3. Attempts to load the class via standard module loading techniques. @param alias: The class name. @type alias: C{string} @raise UnknownClassAlias: The C{alias} was not found. @raise TypeError: Expecting class type or L{ClassAlias} from loader. @return: Class registered to the alias. @rtype: C{classobj} """ # Try the CLASS_CACHE first try: return CLASS_CACHE[alias] except KeyError: pass for loader in CLASS_LOADERS: klass = loader(alias) if klass is None: continue if isinstance(klass, python.class_types): return register_class(klass, alias) elif isinstance(klass, ClassAlias): CLASS_CACHE[klass.alias] = klass CLASS_CACHE[klass.klass] = klass return klass raise TypeError("Expecting class object or ClassAlias from loader") mod_class = alias.split('.') if mod_class: module = '.'.join(mod_class[:-1]) klass = mod_class[-1] try: module = util.get_module(module) except (ImportError, AttributeError): pass else: klass = getattr(module, klass) if isinstance(klass, python.class_types): return register_class(klass, alias) elif isinstance(klass, ClassAlias): CLASS_CACHE[klass.alias] = klass CLASS_CACHE[klass.klass] = klass return klass.klass else: raise TypeError( "Expecting class type or ClassAlias from loader") # All available methods for finding the class have been exhausted raise UnknownClassAlias("Unknown alias for %r" % (alias, ))