Jim Fulton wrote:
Philipp von Weitershausen wrote:
Marius Gedminas wrote:
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
Zope3-dev mailing list