diff --git a/bonobo/config/__init__.py b/bonobo/config/__init__.py index 8e662c4..08be544 100644 --- a/bonobo/config/__init__.py +++ b/bonobo/config/__init__.py @@ -1,7 +1,7 @@ from bonobo.config.configurables import Configurable -from bonobo.config.options import Option, Method +from bonobo.config.options import Method, Option from bonobo.config.processors import ContextProcessor -from bonobo.config.services import Container, Service, Exclusive +from bonobo.config.services import Container, Exclusive, Service, requires # bonobo.config public programming interface __all__ = [ @@ -12,4 +12,5 @@ __all__ = [ 'Method', 'Option', 'Service', + 'requires', ] diff --git a/bonobo/config/services.py b/bonobo/config/services.py index 4a91668..d792175 100644 --- a/bonobo/config/services.py +++ b/bonobo/config/services.py @@ -56,7 +56,11 @@ class Service(Option): inst.__options_values__[self.name] = validate_service_name(value) def resolve(self, inst, services): - return services.get(getattr(inst, self.name)) + try: + name = getattr(inst, self.name) + except AttributeError: + name = self.name + return services.get(name) class Container(dict): @@ -126,3 +130,19 @@ class Exclusive(ContextDecorator): def __exit__(self, *exc): self.get_lock().release() + + +def requires(*service_names): + def decorate(mixed): + try: + options = mixed.__options__ + except AttributeError: + mixed.__options__ = options = {} + + for service_name in service_names: + service = Service(service_name) + service.name = service_name + options[service_name] = service + return mixed + + return decorate