tackling this problem a little bit ago, I found it helpful to create adapters that returned values to index rather than gronky objects (see the first attachment. undoubtably there could be discussion about whether this is useful or just lazy, but I think it could promote code reuse and less pointlessly named "adapter" vars cluttering the namespace).

This let me use a simple closure and loop to register adapters for indexing using plones ExtensibleObjectWrapper:


from Products.CMFPlone.CatalogTool import registerIndexableAttribute

def registerIndexer(idx, iface):
    default = None

    def indexfx(obj, portal, **kw):
        try:
            return iface(obj)
        except TypeError:
            return default

    registerIndexableAttribute(idx, indexfx)

iface_idxs = (('index1', ISomeCalledInterface),
              ('index2', ISomeOtherCalledInterface))

for name, iface in iface_idxs:
    registerIndexer(name, iface)


Getting back to pete's points, I think another tool would be overkill, but something like registerIndexer might work as a directive that could be associated to content ala:

<registerIndexer
    for=".interfaces.IMyContent"
    provides=".interfaces.ISomeCalledInterface"
    factory=".SomeCallabelAdapter"
    permission="zope2.Public"
/>


-w


##############################################################################
#
# Copyright (c) 2004, 2005 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""
An interface that returns a value if adapter or directly provided object is 
callable
"""
from zope.interface.interface import InterfaceClass, adapter_hooks
from zope.interface.interfaces import IInterface
from zope.interface.declarations import classImplements

class CalledInterfaceClass(InterfaceClass):

    def _callOrReturn(self, obj):
        if callable(obj):
            return obj()
        else:
            return obj
        
    def __adapt__(self, obj):
        if self.providedBy(obj):
            return self._callOrReturn(obj)

        for hook in adapter_hooks:
            adapter = hook(self, obj)
            if adapter is not None:
                return self._callOrReturn(adapter)
            
classImplements(InterfaceClass, IInterface)

CalledInterface = CalledInterfaceClass("CalledInterface", __module__ = 
'Products.calledinterface')

__all__=('CalledInterface')
_______________________________________________
Zope-CMF maillist  -  Zope-CMF@lists.zope.org
http://mail.zope.org/mailman/listinfo/zope-cmf

See http://collector.zope.org/CMF for bug reports and feature requests

Reply via email to