[Zope-dev] im_self of methods accessed via non trivial acquisition

Stefan Bund sbund@artec-berlin.com
Fri, 18 Jan 2002 09:42:45 +0100


I have already posted this question on the main zope list but have
not received a reply. I hope som Acquisition god is following this
list to shed some light on this matter. 

If there is some kind of definite documentation for the acquisition
machinery especially for how methods are fetched across acquisition, I
would appreciate a pointer to that Documentation. I allready tried to
digest the ZDG (chapter on Acquisition) and the information on the
'AcquisitionMadness' page
<http://www.zope.org//Wikis/zope-dev/AcquisitionMadness>. Is there any
more *definite* information on Acquisition apart from the source
code. The problem is, I have a bit difficulty reading the source since
it's an extension class :-(...

But now on to the details of my original question (this is a copy of
my post to the zope list):

My question regards the details of how the contents of im_self of an
acquired method is calculated by the acquisition machinery.

To illustrate this, I will depict an acquisition tree using the
following symbols:

  O                    -- an acquisition wrapper
  <upcase letter>      -- an acquitsition wrapper named for further reference
  [<lowercase letter>] -- an object
  --                   -- the aq_parent link
  |                    -- the aq_self link


I will use the following acquisition tree for illustration (it
resembles the tree I have in my application, I just reduced it to
make my point)

A--O--[a]
|  |
|  [b]
|
O--B--O--[c]
|  |  |
|  |  [d]
|  |
|  O--[e]
|  |
|  [f]
|
[g]

(Note: some of the a-g's are identical, but for simpler reference from
the text, i have named them all differently ...)

In this representation, the acquisition order is from bottom to top.
The bottom most object is /A.aq_base/. Acquisition along containment
only produces horizontal lines of acquisition wrappers.

let /m/ be a method of the objekt /f/. The expression of interest is

    x := A.m

I would expect /x.im_self/ to be an acquisition wrapper C

    C := A.f

where (as far as i understand the rules of acquisition) 
/C.aq_parent == A/

But instead displaying  /x.im_self/ yields the acquisition tree rooted
at /B/ !!

I find this a bit disturbing. My question: 'Is it a *bug* or a
*feature*?'. I hope, I made my point clear.

I hope someone can shed light on this subject,

Stefan.