[Mindwrapper] GetParent, GetRoot, dirt flag
Status: Alpha
Brought to you by:
donnal
From: Donnal W. <don...@ya...> - 2003-04-12 04:09:12
|
OK, I've made a few of the requested changes. I thought it would be simple to start with GetParent(). The first problem, though, is that the self._parent attribute is a node, so every recursive function that looks for nodes in the tree tries to act upon this attribute as well, and the result is infinite recursion. No problem: just test to see of the name is '_parent', and if so ignore it, right? But this is an ugly hack IMO, so I changed all occurrences of: isinstance(attr, node), to name[0] != '_'. This is still not elegant, but neither was type testing, and it is cleaner this way. This approach means that every attribute of a branch object that does NOT begin with '_' is assumed to be another node. At first I was going to put a set of unittests for GetParent() in a separate file, but it was easier (and probably more appropriate, as well) to add the various tests to existing files. I may not have thought of every contingency, but all the initial tests passed. At the same time I added GetRoot(). I don't know if this needs to be part of the public API, but the user-developer might need this as much as GetParent() so I put it in. In any case, Document.Retrieve() does need self._root. GetParent() and GetRoot() are not only necessary for the public API, they should be used in subclasses, too. One complication that took me awhile to figure out is that initially I made a root node have parent == self and root == self. This is a self-reference, which in and of itself would be no problem. BUT, this does mean that the object doesn't get garbage collected immediately, so my weak referencing scheme for observers gave me an error in the regression tests. The eventual solution was to set make the parent equal to None in the root node and then RETURN self if parent (or root) is equal to None. I also added the dirty flag which gets set whenever a value is change and then sends it back down the tree toward the root. The relevant methods are _smear(), _clean(), IsClean(). I believe that all the changes are now in CVS on Sourceforge. Regards, ===== Donnal Walter Arkansas Children's Hospital |