Data::Grove::Visitor(3User Contributed Perl DocumentatiData::Grove::Visitor(3)
Data::Grove::Visitor - add visitor/callback methods to Data::Grove
@results = $object->accept ($visitor, ...);
@results = $object->accept_name ($visitor, ...);
@results = $object->children_accept ($visitor, ...);
@results = $object->children_accept_name ($visitor, ...);
Data::Grove::Visitor adds visitor methods (callbacks) to Data::Grove
objects. A ``visitor'' is a class (a package) you write that has meth-
ods (subs) corresponding to the objects in the classes being visited.
You use the visitor methods by creating an instance of your visitor
class, and then calling `"accept($my_visitor)"' on the top-most object
you want to visit, that object will in turn call your visitor back with
`"visit_OBJECT"', where OBJECT is the type of object.
There are several forms of `"accept"'. Simply calling `"accept"' calls
your package back using the object type of the object you are visiting.
Calling `"accept_name"' on an element object calls you back with
`"visit_name_NAME"' where NAME is the tag name of the element, on all
other objects it's as if you called `"accept"'.
All of the forms of `"accept"' return a concatenated list of the result
of all `"visit"' methods.
`"children_accept"' calls `"accept"' on each of the children of the
element. This is generally used in element callbacks to recurse down
into the element's children, you don't need to get the element's con-
tents and call `"accept"' on each item. `"children_accept_name"' does
the same but calling `"accept_name"' on each of the children.
`"attr_accept"' calls `"accept"' on each of the objects in the named
Refer to the documentation of the classes you are visiting (XML::Grove,
etc.) for the type names (`"element"', `"document"', etc.) of the
objects it implements.
The hash keys `"Contents"' and `"Name"' are used to indicate objects
with children (for `"children_accept"') and named objects (for
These are random ideas that haven't been implemented yet:
o Several objects fall into subclasses, or you may want to be able to
subclass a visited object and still be able to tell the difference.
In SGML::Grove I had used the package name in the callback
(`"visit_SGML_Element"') instead of a generic name (`"visit_ele-
ment"'). The idea here would be to try calling `"visit_PACKAGE"'
with the most specific class first, then try superclasses, and
lastly to try the generic.
Ken MacLeod, firstname.lastname@example.org
Extensible Markup Language (XML) <http://www.w3c.org/XML>
perl v5.8.6 2003-10-21 Data::Grove::Visitor(3)