[PEAK] Adapting based on property
Peter Parente
parente at cs.unc.edu
Wed Jun 29 09:21:53 EDT 2005
Neat. Is there any doc about the new features in CVS HEAD?
Thanks,
Pete
On Wed, 29 Jun 2005 09:16:14 -0400, Phillip J. Eby <pje at telecommunity.com>
wrote:
> At 07:12 AM 6/29/2005 -0400, Peter Parente wrote:
>> I'm guessing what I really need is an adapter factory that does
>> something
>> like the following pseudocode:
>>
>> def accessibleAdapterFactory(obj):
>> # get object role
>> role = obj.Role
>> # look for adapters for given role and type
>> return protocol.registry.findAdapterFor(role=role,
>> type=type(obj))
>>
>> Is such a thing possible with pyprotocols?
>
> Yes. One way is to define the adapter function as a generic function
> (using the current CVS HEAD of PyProtocols):
>
> import dispatch
>
> @dispatch.generic()
> def createIList(obj):
> """Generic function for adapting Accessible"""
>
> @createIList.when("obj.Role==ComboBox")
> def createComboBoxAsList(obj):
> return AccessibleComboboxAsList(obj)
>
>
>> Is there another solution?
>
> Yes; instead of adapting, you can use generic functions to perform
> operations like getLength() directly, e.g.:
>
> @dispatch.generic()
> def getLength(obj)
> pass
>
> @getLength.when("obj.Role==ListView")
> def listViewLength(obj):
> return obj.Value
>
> @getLength.when("obj.Role==ComboBox")
> def comboBoxLength(obj):
> return obj.child['list'].Value
>
> Of course, generic functions will do the check on every call (but using
> a hash table lookup if your obj.Role values are hashable), and adapters
> need only be created once. There are other tradeoffs regarding code
> clarity as well; sometimes interfaces are clearer for a given use case,
> sometimes generic functions.
>
More information about the PEAK
mailing list