def __new__(metatype, name, bases, namespace): secondary = None for base in reversed(bases): metaclass = getattr(base, "__metaclass__", None) if metaclass and metaclass is not metatype: if not secondary: secondary = metaclass elif metaclass is not secondary: raise SpireError("cannot reconcile more then two metaclass bases") unit = None if secondary: metatype = type("metaclass", (metatype, secondary), {"__secondary_metaclass__": secondary}) unit = secondary.__new__(metatype, name, bases, namespace) unit.__metaclass__ = metatype else: for base in reversed(bases): candidate = getattr(base, "__secondary_metaclass__", None) if candidate: if not secondary: secondary = candidate elif candidate is not secondary: raise SpireError() secondary = secondary or type unit = secondary.__new__(metatype, name, bases, namespace) unit.identity = identify_object(unit) configuration = {} dependencies = {} for base in reversed(bases): inherited_configuration = getattr(base, "configuration", None) if isinstance(inherited_configuration, Configuration): configuration.update(inherited_configuration.schema.structure) inherited_dependencies = getattr(base, "dependencies", None) if inherited_dependencies: dependencies.update(inherited_dependencies) declared_configuration = namespace.get("configuration") if isinstance(declared_configuration, Configuration): declared_configuration.schema.merge(configuration) declared_configuration.bind(unit) else: if isinstance(declared_configuration, dict): configuration.update(declared_configuration) if configuration: unit.configuration = Configuration(configuration).bind(unit) unit.dependencies = {} for attr, value in namespace.iteritems(): if isinstance(value, Dependency): Registry.register_dependency(value) unit.dependencies[attr] = value.bind(unit, attr) for name, dependency in dependencies.iteritems(): if name not in unit.dependencies: dependency = dependency.clone().bind(unit, name) unit.dependencies[name] = dependency setattr(unit, name, dependency) Registry.register_unit(unit) return unit
def register(cls, *args, **params): Registry.register_dependency(cls(*args, **params))
def __new__(metatype, name, bases, namespace): secondary = None for base in reversed(bases): metaclass = getattr(base, '__metaclass__', None) if metaclass and metaclass is not metatype: if not secondary: secondary = metaclass elif metaclass is not secondary: raise SpireError( 'cannot reconcile more then two metaclass bases') unit = None if secondary: metatype = type('metaclass', (metatype, secondary), {'__secondary_metaclass__': secondary}) unit = secondary.__new__(metatype, name, bases, namespace) unit.__metaclass__ = metatype else: for base in reversed(bases): candidate = getattr(base, '__secondary_metaclass__', None) if candidate: if not secondary: secondary = candidate elif candidate is not secondary: raise SpireError() secondary = secondary or type unit = secondary.__new__(metatype, name, bases, namespace) unit.identity = identify_object(unit) configuration = {} dependencies = {} for base in reversed(bases): inherited_configuration = getattr(base, 'configuration', None) if isinstance(inherited_configuration, Configuration): configuration.update(inherited_configuration.schema.structure) inherited_dependencies = getattr(base, 'dependencies', None) if inherited_dependencies: dependencies.update(inherited_dependencies) declared_configuration = namespace.get('configuration') if isinstance(declared_configuration, Configuration): declared_configuration.schema.merge(configuration) declared_configuration.bind(unit) else: if isinstance(declared_configuration, dict): configuration.update(declared_configuration) if configuration: unit.configuration = Configuration(configuration).bind(unit) unit.dependencies = {} for attr, value in namespace.iteritems(): if isinstance(value, Dependency): Registry.register_dependency(value) unit.dependencies[attr] = value.bind(unit, attr) for name, dependency in dependencies.iteritems(): if name not in unit.dependencies: dependency = dependency.clone().bind(unit, name) unit.dependencies[name] = dependency setattr(unit, name, dependency) Registry.register_unit(unit) return unit