Data::Grove::Visitor − add visitor/callback methods to
Data::Grove objects

 use Data::Grove::Visitor;

      @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 methods (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 contents 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 attribute.

     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 ‘"accept_name"’).

These are random ideas that haven’t been implemented yet:

•   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_element"’).  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,

perl(1), Data::Grove

     Extensible Markup Language (XML)