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

Reply via email to