diff --git a/src/graph_ZCA/base.py b/src/graph_ZCA/base.py new file mode 100644 --- /dev/null +++ b/src/graph_ZCA/base.py @@ -0,0 +1,82 @@ +from zope.interface.interfaces import ComponentLookupError + +from zope.interface import providedBy +from zope.component import getGlobalSiteManager, getMultiAdapter + +from graph.interfaces import IBaseComponent + + +gsm = getGlobalSiteManager() + + +class BaseAdapter(object): + """ + Base for all Adapters + """ +# implements(IBaseAdapter) + + def __init__(self, obj): + """ + Gets an Object to be adapted + """ + self.obj = obj + +class BaseComponent(object): + """ + """ + + def __init__(self, parent): + self.parent = parent + self.items = [] + + def addItem(self, item): + self.items.append(item) + + def setup(self, *args, **kwargs): + pass + +class BaseFactory(object): + def __init__(self, obj, *args, **kwargs): + """ + Gets an Object to be adapted + """ + self.obj = obj + self.args = args + self.kwargs = kwargs + + def __call__(self, *args, **kwargs): + parent_vector = self.traverse_parents() + adapter = self.find_adapter(parent_vector) + adapter.setup(*args, **kwargs) + return adapter + + def find_adapter(self, parent_vector): + for i in range(len(parent_vector)): + try: + adapter = getMultiAdapter(parent_vector[i:], self.target_interface) + except ComponentLookupError: + pass + else: + if adapter : + return adapter + + def traverse_parents(self): + """ + Retrieve the vector of all component parents up to the top level component which has no parent + """ + parent_vector = [self.obj] + obj = self.obj + while obj.parent: + obj = obj.parent + parent_vector.append(obj) + parent_vector.reverse() + return parent_vector + + def getComponentInterfaceOf(self, obj): + """ + Retrieve the interfacess a certain instance is providing. + Filter out the interface that belongs to our framework. + """ + for interface in providedBy(obj): + if isinstance(interface, IBaseComponent.__class__): + return interface