[Zope-dev] split out zope.component "mechanics" into a separate package (was Re: improving the utility and adapter lookup APIs)

Chris McDonough chrism at plope.com
Fri Nov 27 12:45:29 EST 2009

Martijn Faassen wrote:
> Chris McDonough wrote:
>> Chris McDonough wrote:
>>>> If some set of ZCA APIs made it the responsibility of the *caller* to invoke 
>>>> the adapter with arguments would go a long way between normalizing the 
>>>> difference between utilities and adapters (because they would essentially then 
>>>> be the same thing).
>> The very core mechanics of how a component registry behaves resides almost 
>> entirely in the zope.component.registry module.
>> It would be useful to split these core mechanics into a separate package. 
>> Here's why:
>> - The zope.component module carries along an expectation of a particular global
>>    API.  This global API is not required to use the mechanics of the underlying
>>    registry machinery.
>> - The zope.component package has a number of features that are irrelevant
>>    to the operation of the core registry itself, such as persistence and
>>    security.
>> - The registry itself is useful outside the context of the zope.component API
>>    package; the API is essentially just "candy" on top of the registry itself.
>> I have created such a package at http://svn.zope.org/Sandbox/chrism/zope.registry
>> It contains an implementation of the registry and the tests for the registry 
>> object.  It depends on zope.interface and zope.event.  I'd like to actually 
>> remove the zope.event dependency and release a newer version of zope.event that 
>> uses a global inside zope.registry as the list of registered object (reverse 
>> the dependency).
>> After that's done, I'd suggest we make zope.component depend on zope.registry.
>> At this point, people can innovate with their own APIs to the registry object 
>> as necessary; they needn't carry along the baggage of the expecation of the 
>> older zope.component API working in their app.
> One of my first responses would be some worry about zope.component 
> growing a *new* dependency. The goal of zope.component is that it's one 
> of those packages with only a few...
> I'm trying to see who would be using zope.registry for what exactly. 
> Would it be much harder to experiment with these new APIs on top of 
> zope.component? You'll get a bit more baggage, but the minimal 
> dependency story should be quite small already. I'd rather get some of 
> the additional dependencies (that have a lot to do with supporting ZCML) 
> out of it, instead of moving its core functionality out.

I guess this was just a way of trying to draw a line between "the component 
architecture" (and the conceptual baggage which surrounds it) and useful 
machinery that currently is hidden inside of it that really should have a life 
of its own.  It's obviously not the only way to do that.

It tries to address the following problem.

Currently people seem to get wrapped around the axle and confused by the 
purpose of "the ZCA", which currently implies at least two different things:

- Machinery to perform complex registrations and lookups using interfaces
   in the form of a registry.

- A global API that presents a view of the world: "there are these things
   called utilities and adapters, and this API is how you do adaptation and
   utility lookup".

These two things are conceptually distinct.

It shouldn't be necessary to need to understand the concept of "utility" and 
"adapter" to use a registry.  A registry is just machinery that uses interfaces 
as registration markers for the benefit of later arbitrary lookups, not 
necessarily just for "finding utilities" or "finding and calling adapter 
factories".  For instance, you might use the registry to register some callable 
that accepts *no* arguments with, say, two "requires" arguments.  You shouldn't 
need to call this an "adapter", because it's not one; you just want to register 
something and get it back when you ask nicely.

The API of a registry should be able to evolve separately from the API of its 
consumers (the global ZCA API is only one consumer).  The current registry API 
  permits the concepts of utility and adapter to bleed into the implementation, 
but this needn't be the case forever.  We could provide (and document) a very 
simple registry base class with a normalized API that didn't have any of this 
conceptual baggage; it would be extremely popular, I think.

Likewise, it should be possible to use a different registry implementation to 
service the ZCA global API.  This is possible right now via 
getSiteManager.sethook, of course.

> You factored various related things together - perhaps it would make 
> sense to do this refactoring within zope.component?
> I'm +1 on making zope.event part of zope.component and deprecating 
> zope.event.
> Speculating, would it instead make sense to move zope.registry 
> functionality into zope.interface? The only additional dependency is 
> zope.event. At first glance the answer would be "no" as it really 
> introduces various component architecture concepts...

It might make sense to me to put a very simple component registry in 
zope.interface: it already has the concept of "adapter" baked in.

- C

More information about the Zope-Dev mailing list