I've come across an error on trying to add a Specialist. Zope 2.2b4, ZPatterns latest release (ZPatterns-0-4-0a1). Go to the zope management pages, as a Manager. Choose to add a Specialist. Leave the "Create Default Rack of type" drop-down set to "Rack". Put in an appropiate id, such as "test". Press "Add". We get a Zope error: Error Type: TypeError Error Value: keyword parameter redefined Traceback (innermost last): File /usr/local/zope/SiteBox/lib/python/ZPublisher/Publish.py, line 222, in publish_module File /usr/local/zope/SiteBox/lib/python/ZPublisher/Publish.py, line 187, in publish File /usr/local/zope/SiteBox/lib/python/Zope/__init__.py, line 221, in zpublisher_exception_hook File /usr/local/zope/SiteBox/lib/python/ZPublisher/Publish.py, line 171, in publish File /usr/local/zope/SiteBox/lib/python/ZPublisher/mapply.py, line 160, in mapply (Object: manage_addSpecialist) File /usr/local/zope/SiteBox/lib/python/ZPublisher/Publish.py, line 112, in call_object (Object: manage_addSpecialist) File /usr/local/zope/SiteBox/lib/python/Products/ZPatterns/Specialists.py, line 71, in manage_addSpecialist File /usr/local/zope/SiteBox/lib/python/Products/ZPatterns/PlugIns.py, line 436, in _constructPlugIn TypeError: (see above) The error occurs because the _constructPlugIn() method of PlugIns.py attempts to give "id" to manage_addRack as a keyword argument, whereas it has already been given the id as a positional argument. Actually, I think what it is being given as an id is wrong too :-) The offending line is 436: return apply(getattr(product, method), (product,)+args, kwargs) The rest of this is mainly for my benefit, and will be obvious to anyone familiar with the code :-) "getattr(product, method)" evaluates to the python method manage_addRack, and it appears to be a bound method. "product" is a __FactoryDispatcher__ instance. "args" is None, or (). "kwargs" is {'id': 'defaultRack'}. The signature of manage_addRack() is: def manage_addRack(self, id, title='', REQUEST=None): and is effectively getting called as: instance.manage_addRack(some __FactoryDispatcher__, id='defaultRack') I'm not sure whether the method intended to get an unbound method rather than a bound one, or whether "id" needs special handling here. -- Steve Alexander Software Engineer Cat-Box limited http://www.cat-box.net