Example #1
0
    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
Example #2
0
 def register(cls, *args, **params):
     Registry.register_dependency(cls(*args, **params))
Example #3
0
 def register(cls, *args, **params):
     Registry.register_dependency(cls(*args, **params))
Example #4
0
    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