import protocols from interfaces import * import validators class Controller(object): #protocols.advise( # instancesImplement=[IController]) def __init__(self, obj, immutable=False): self.obj = obj self.immutable = immutable self.validator = validators.adaptValidator(self.obj) self.attrNames = self.validator.fields.keys() def attributes(self): result = {} for name in self.attrNames(): value = getattr(self.obj, name) try: controller = protocols.adapt(value, IController) except NotImplementedError: pass else: value = controller.attributes() result[name] = value return result def copyWithAttributes(self, attrs): return self.obj.__class__(**attrs) def setAttributes(self, attrs): for name, value in attrs: assert name in self.attrNames, "The attribute %r is not expected" % name value = getattr(self.obj, name) try: controller = protocols.adapt(value, IController) except NotImplementedError: setattr(self.obj, name, value) else: setattr(self.obj, name, controller.copyWithAttributes(value))