# Is this *too* flexible? # Am I being naive? Doing it wrong? from contextlib import contextmanager class MissingParameterError(Exception): def __init__(self, value): self.parameter = value def __str__(self): return repr(self.parameter) # Something like this for the template backend stuff class Template(object): def __init__(self, template_name): self.template_name = template_name self.arguments = {} def __setattr__(self, attr, value): if attr in ("arguments", "template_name"): object.__setattr__(self, attr, value) else: self.arguments[attr] = value def build(self): print "Building template %s with arguments: %s" % (self.template_name, self.arguments) # Do some validation checking on certain arguments, execute code as needed # Delete arbitrairy arguments that could be created (but inform the user) # Something like this for the service backend stuff class Service(object): def __init__(self, service_name): self.service_name = service_name self.arguments = {} def __setattr__(self, attr, value): if attr in ("arguments", "service_name"): object.__setattr__(self, attr, value) else: self.arguments[attr] = value def build(self): print "Building service %s with arguments: %s" % (self.service_name, self.arguments) # Do some validation checking on certain arguments, execute code as needed # Delete arbitrairy arguments that could be created (but inform the user) # Context manager to kick off the dirty work @contextmanager def create_template(name = None): if not name: raise MissingParameterError("Missing template name") template = Template(name) yield template template.build() # Context manager to kick off the dirty work @contextmanager def create_service(name = None): if not name: raise MissingParameterError("Missing service name") service = Service(name) yield service service.build() # Services/Templates would look something like this: with create_service(name = "network") as service: service.description = "Define network stuff" service.provides = ['network_guts'] with create_template(name = "test_template") as webserver_template: webserver_template.desciption = "Builds web server" webserver_template.provides = ['webserver'] webserver_template.needs = ['services.network'] webserver_template.accounts = ['bsmith', 'mcrute']