[CEDET-devel] eieio call-next-method ?
Brought to you by:
zappo
From: Pierre L. <de...@po...> - 2009-11-04 14:57:10
|
Hi, Is call-next-method really designed for iterative use ? Finding the next method is based on the state of the eieio-generic-call-next-method-list variable. More or less, the next method is the car of this list. But the point is the following let wrapping in the call-next-method method where eieio-generic-call-next-method-list is set to its queue for recursive usage. This leads to following problem : Suppose A is the parent class, and B inherit from A and C inherit from B. In method `method' in C, we call a call-next-method. In method `method' of B we call call-next-method again. The eieio-generic-call-next-method-list is set once when we call method `method' of C. And the queue of this list is used when calling call-next-method for B. It means in particular that if C' is another class inheriting from B, if we call method `method' in C', eieio-generic-call-next-method-list can be differently initialized as it would be if calling from C. As a consequence the call-next-method call in method `method' in B might have a different effect. Is it really desired ? In my opinion, call-next-method should produce the same effect even from where the initial call comes. Perhaps I misunderstood something in the language specs ! But for me this notion of next if something absolute and not relative to the class tree below a given class. I'd suggest to replace the existing wrapping in call-next-method >>> -- Original wrapping (let* ((eieio-generic-call-next-method-list (cdr eieio-generic-call-next-method-list)) (scoped-class (cdr next)) (fcn (car next)) ) >>> -- End Original wrapping by : >>> -- Replacing wrapping (let* ((eieio-generic-call-next-method-list (cdr (eieiomt-method-list eieio-generic-call-methodname eieio-generic-call-key (cdr next)))) (scoped-class (cdr next)) (fcn (car next)) (eieio-generic-call-arglst newargs) ) >>> -- End Replacing wrapping Regards Pierre |