[Zope3-dev] Subtle differences between AdapterRegistry and PersistentAdapterRegistry

Philipp von Weitershausen philipp at weitershausen.de
Sun Feb 4 19:50:14 EST 2007


There's a subtle difference between the standard AdapterRegistry  
(from zope.interface.adapter) used for the global component registry  
and PersistentAdapterRegistry (from  
zope.component.persistentregistry) -- apart from the fact that the  
latter is persistent:

When you set the __bases__ property on AdapterRegistry, it tells the  
adapter registries higher up in the hierarchy that it's there by  
calling an _addSubregistry() method on them,  
PersistentAdapterRegistry doesn't do this and doesn't have an  
_addSubregistry() method.


Usually this doesn't come into effect because the global component  
registry with a regular AdapterRegistry is typically highest in the  
hierarchy:

              global component registry
                 w/ AdapterRegistry
                          ^
                          |
                          |
   persistent component registry (e.g. ++etc++site)
           w/ PersistentAdapterRegistry
                          ^
                          |
                          |
   persistent component registry (e.g. ++etc++site)
           w/ PersistentAdapterRegistry
                          |
                         ...


Now, let's imagine you actually put a "global" (that means non- 
persistent) component registry *after* a persistent component  
registry, e.g. you have

                  global component registry
                     w/ AdapterRegistry
                              ^
                              |
                              |
         persistent component registry (e.g. ++etc++site)
                 w/ PersistentAdapterRegistry
                              ^
                              |
                              |
non-persistent component registry (created during traversal)
                      w/ AdapterRegistry


Creating that non-persistent component registry works fine, you can  
simply use BaseGlobalComponents(). However, when you set the  
__bases__, AdapterRegistry will try to call _addSubregistry() on the  
PersistentAdapterRegistry that's higher up in the hierarchy and the  
whole thing goes ka-boom:

Traceback (most recent call last):
   ...
   File "/Users/philipp/dev/ploneout/src/kss.core/kss/core/ 
azaxview.py", line 60, in __init__
     self._sitemanager.__bases__ = (next, )
   ...
AttributeError: 'PersistentAdapterRegistry' object has no attribute  
'_addSubregistry'


This is quite annoying. Do I have to write my own component registry,  
subclassign from BaseGlobalComponents so that I won't use  
AdapterRegistry but a variant that doesn't end up assuming  
_addSubregistry on the other registries? Or is the _addSubregistry  
thign some legacy that can be removed (it doesn't seem to be used at  
all in Zope 3 currently)?

Philipp




More information about the Zope3-dev mailing list