[Zope3-dev] Re: adapter registration question

Tres Seaver tseaver at palladion.com
Thu Nov 16 21:26:54 EST 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Chris Withers wrote:
> Philipp von Weitershausen wrote:
>>   >>> IZopeDublinCore(obj)
>>
>> is a flexible version of
>>
>>   >>> ZDCAnnotatableAdapter(obj)
>>
>> Flexible, because a different implementation that ZDCAnnotatableAdapter 
>> might be used. That's dispatched through the adapter registry.
> 
> Right, exactly.
> 
>>> IZopeDublinCore(myobj) does an adapter lookup based on the type of 
>>> 'myobj' 
>> That's the lookup in the registry (part 1 of the adapter call)
>>
>>> and returns an adapter instance with myobj as context, ready to be used.
>> That's the instantiation a la str(123) (part 2 of the adapter call)
> 
> Ah, I think this is becoming clearer...
> 
> So, as another example, I could register the following as a factory for 
> turning instances of DateTime instances into datetime instances:
> 
> def convert_dates(date):
>     return datetime(year=date.Year(),month=date.Month(),day=date.Month())
> 
> The important thing here, for me, is that the adapted value is not an 
> instance of the adapter factory.

Factories return objects -- that's what they are for.  If you register a
class as an adapter factory (which the vast bulk of Zope3 applications
do) then the adapter returned by the factory will be an instance of that
class, because calling the class gives you an instance.  Note that in
the terms used in Zope3, the *returned object* is the adapter:  the
callable is the thing which *makes* adapters.

Any callable which takes the appropriate number of arguments can be
registered as a factory:  the only contract is that the return value
from the callable is supposed to implement the interface for which the
factory was registered.  The only (current) exception is "subscription
adapters", which are registered for 'None' rather than an interface:
their return value is *ignored*, because they do all their work when called.

We were discussion a (notional) "value adapter", whose factory would
have the contract of returning an object of a specific concrete type,
rather than on implementing an interface.  There are reasonable usecases
for such adapters, but the CA machinery doesn't permit registering them:
 it requires that the 'provided' argument be either an interface or None
(although the 'required' args can be concrete types).

Hope that clarifies, rather than confuses, the discussion.


Tres.
- --
===================================================================
Tres Seaver          +1 202-558-7113          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFXR3u+gerLs4ltQ4RAqjQAJ9FcZvkmqC3/xNQ6KOWKHZhRPJD9QCeIR52
SDaTro7khfMJLSM5w2BtsG4=
=iGfr
-----END PGP SIGNATURE-----



More information about the Zope3-dev mailing list