Marius Gedminas wrote:
On Wed, Sep 26, 2007 at 09:09:37PM -0400, Tres Seaver wrote:
Why does the caller care? She just wants an object which will provide
the 'IFoo' contract on behalf of the passed context. If 'x' is capable
of providing 'IFoo' without help, then failing (or worse, returning a
less-specific factory result) when calling 'getAdapter' is the Wrong
Thing (a "least surprise" violation, if nothing else).
FWIW it was a big surprise to me when I discovered that IFoo(x) has
different semantics from getAdapter(x, IFoo).
That's true. I spent hours debugging errors related to the adaption
mechanism. The different api's and its differing lookup mechanism is
only one piece in the collection of obscurities. Other pieces are caused
by different frameworks that using the underlying adaption mechanism:
One problem is that sometimes implemented or adapted objects got treated
in different way (ex. form-framework: it's modified event notification).
Another problem is that an adapted context might not locatable if its
adapter does not implement ILocation or does not get location proxied
implicitly (ex. local/global security).
All those examples and solutions are based on assumptions about
implementations and that is causing the adaption-voodoo.
Lookup by interfaces and therefore the adaption asserts a higher logical
abstraction layer which should encapsulate such implementation details
(like adaption-, localisation- and lookup-mechanism) in a *reasonable*
way. If code that relies on this abstraction has to differ the
underlying mechanism and the kind of the result, it is *necessary* to
provide an api that covers those needs - IOW why should the caller care
or make voodoo if he gets what he wants?
It would be great, if we could handle other adaption-derivations by the
proposed unified, reasonable adaption-api too.
Example using the IFoo()-syntax:
Single adaptation IFoo(a)
... with default IFoo(a, default=y)
... assert location IFoo(a, default=y, locate=True)
... no conform-call IFoo(a, default=y, coform=False)
... force adaption IFoo(a, default=y, force_adaption=True)
... explicit context IFoo(a, context=specific_context)
Multi adaptation IFoo(multi=(a,b))
... with default IFoo(multi=(a,b), default=y)
Named multi adapter IFoo(multi=(a,b), name='z')
... with default IFoo(multi=(a,b), name='z', default=y)
... assert location IFoo(multi=(a,b), default=y, locate=True)
Zope3-dev mailing list