[Zope-dev] split out zope.component "mechanics" into a separate package (was Re: improving the utility and adapter lookup APIs)
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
>> - 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
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
> 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.
More information about the Zope-Dev