Jim Fulton wrote:
Philipp von Weitershausen wrote:

Marius Gedminas wrote:

I'd prefer

   from zope.annotation.adapter import AnnotationAdapter

   getFoo = AnnotationAdapter(for_=IBar,
   # I suppose the key could be optional; you could use a dotted
   # interface name by default

and then the ordinary

   <zope:adapter factory=".foo.getFoo" />


I just tried to write AnnotationAdapter. Unfortunately, I haven't gotten very far yet, as it turns out I need to understand the internals of the implementation of the zope:adapter ZCML statement.

zope:adapter has a bunch of automation to look for the interface of something and what it adapts on the factory. This works if the factory is the class itself, but in this case, the factory is a class which has instances which can provide an instance of the annotation class when called.

So, I need to come up with trickery so that instances of AnnotationAdapter return the 'for_' argument when asked for by zope.interface.implementedBy() and the 'factory' argument when called with component.adaptedBy(). Since the instances of AnnotationAdapter are actually not doing any adaptation or implementing any of the interface, but are actually just providing a factory, it seems like this trickery would amount to actually lying.

This is hairy enough for me to give up for now.

Unless I'm missing something, I conclude that implementing AnnotationAdapter is currently at least as difficult as just implementing a new directive. The other conclusion is that figuring out what is happening in case something goes wrong is also at least as hard to understand as the innards of a directive, due to the trickery necessary to make it work.

Using <zope:adapter..> with an explicit 'for' and 'provides' would avoid the problem, but this seems to be going against the suggestions given in this thread.


Zope3-dev mailing list
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com

Reply via email to