On Mon, 19 Feb 2001, Itai Tavor wrote:
You posted your questions 3 days ago, so maybe you found a solution by now... but this might still be useful to you.
I just unwrapped the visitor pattern into an psuedo-case statement <grin>.
- I'm passing _ explicitly instead of relying on binding. I vaguely recall reading something about a problem binding the namespace. It might be fixed in the latest Python Scripts, I haven't tried the CVS version yet.
This appeared to be the key. I changed my 'accept(me)' call to read 'accept(me,_=_)', and everything started working. Thanks very much!
- visitLineItem is called in the context of an OrderLineItem, so no <dtml-with item> is needed.
I had actually tried that and gotten an even less intelligable error message. So now I've reverted to that form and it works great.
- If you wanted the visitor to implement looping over the items (which is how the GoF do it) you could easily make something like:
Order.displayItemsVisitor.displayItems (DTML Method): <dtml-in line_items> <tr> <dtml-var "_['sequence-item'].accept(container, _)"> </tr> </dtml-in>
Yeah, that's more or less what I do. My display dtml-method gets passed the list of objects, and it does the loop (implementing the batching logic for dtml-in) calling accept on the items in the list. I need to rename my folder to make it's purpose clearer, though <grin>.
BTW, I never thought of using a visitor for this until you brought it up, so thanks! What I really like about it is that the same 'accept' method can be used by multiple visitors, each one implementing a different view of the object. So I can have displayItemsVisitor, displayItemsCompactVisitor, and displayItemsEditableVisitor, all
Yeah, exactly. displayItemsEditableVisitor is why I chose to implement the visitor pattern. I've wound up doing it another way (checking the auth of the logged in user and putting in a button), but I suspect I'll have another Visitor before I'm through with the project. Thanks again for your help. --RDM