[Zope-dev] Acquisition Confusion :S

Evan Simpson evan@digicool.com
Tue, 8 Aug 2000 19:03:45 -0400


From: Chris Withers <chrisw@nipltd.com>
> Who would be best to ask why it was set up the way it is?
>
> I'm sure there are very good reasons for it but the search order in all
> but the simple cases is very confusing and not as useful as it could be.
>
> How much more work would it be to implement the following algorithm,
> regardless of how the actual containment is?
[snip]

I haven't got the whole reason, but here are some of the pieces:

- never expose a "bare" object, or even one with an incomplete context
- allow the user to backtrack along the context chain

These two together give you the part about aq_parent always being the
previous acquisition result.

- allow recovery of containment information
- base security on containment

These two motivate the simplification of raw acquisition.  With the
simplification, you get containment-first search and aq_inner.aq_parent
gives you your fully-wrapped container.

The current acquisition implementation is thus a weird hybrid of containment
and context.  It retains both sorts of information while providing the
search semantics we want security to have.

It isn't hard to convert a standard acquisition wrapper into either of the
other sort.  I'm going to propose adding something like the following
functions:

def aq_context(ob):
    context = []
    while ob is not None:
        context.append(ob.aq_base)
        ob = ob.aq_parent
    ob = context.pop()
    while context:
        ob = context.pop().__of__(ob)
    return ob

def aq_containment(ob):
    context = []
    while ob is not None:
        context.append(ob.aq_base)
        ob = ob.aq_inner.aq_parent
    ob = context.pop()
    while context:
        ob = context.pop().__of__(ob)
    return ob

... so that you could write something like <dtml-var
expr="aq_context(foo).bar"> or <dtml-with foo
context>&dtml-bar;</dtml-with>.  In the meantime, they make fine External
Methods.

Cheers,

Evan @ digicool & 4-am