### traditional [python] import domain_specific class Generator(object): def load(self, value): if isinstance(value, (int, long)): self.push_int(self.value) elif isinstance(value, (basestring,)): self.push_string(self.value) elif isinstance(value, (domain_specific.Namespace,)): self.push_namespace(self.value) elif isinstance(value, (domain_specific.QName,)): self.push_qname(self.value) ### zope [python] from zope.interface import Interface from magic import adapt, Adapter import domain_specific class IArgument(Interface): def generate(bytecodes): pass @adapt([int, long], IArgument) class IntAdapter(Adapter): def generate(self, bytecodes): bytecodes.push_int(self.value) @adapt([basestring], IArgument) class StringAdapter(Adapter): def generate(self, bytecodes): bytecodes.push_string(self.value) @adapt([domain_specific.Namespace], IArgument) class NamespaceAdapter(Adapter): def generate(bytecodes): bytecodes.push_namespace(self.value) @adapt([domain_specific.QName], IArgument) class QNameAdapter(Adapter): def generate(bytecodes): bytecodes.push_qname(self.value) class Generator(object): def load(self, value): IArgument(value).generate(self)