Data::Visitor.3pm

Langue: en

Version: 2008-01-15 (mandriva - 01/05/08)

Section: 3 (Bibliothèques de fonctions)

NAME

Data::Visitor - Visitor style traversal of Perl data structures

SYNOPSIS

         # NOTE
         # You probably want to use Data::Visitor::Callback for trivial things
 
         package FooCounter;
         use base qw/Data::Visitor/;
 
         BEGIN { __PACKAGE__->mk_accessors( "number_of_foos" ) };
 
         sub visit_value {
                 my ( $self, $data ) = @_;
 
                 if ( defined $data and $data eq "foo" ) {
                         $self->number_of_foos( ($self->number_of_foos || 0) + 1 );
                 }
 
                 return $data;
         }
 
         my $counter = FooCounter->new;
 
         $counter->visit( {
                 this => "that",
                 some_foos => [ qw/foo foo bar foo/ ],
                 the_other => "foo",
         });
 
         $counter->number_of_foos; # this is now 4
 
 

DESCRIPTION

This module is a simple visitor implementation for Perl values.

It has a main dispatcher method, "visit", which takes a single perl value and then calls the methods appropriate for that value.

METHODS

visit $data
This method takes any Perl value as it's only argument, and dispatches to the various other visiting methods, based on the data's type.
visit_object $object
If the value is a blessed object, "visit" calls this method. The base implementation will just forward to "visit_value".
visit_ref $value
Generic recursive visitor. All non blessed values are given to this.

"visit_object" can delegate to this method in order to visit the object anyway.

This will check if the visitor can handle "visit_$reftype" (lowercase), and if not delegate to "visit_value" instead.

visit_array $array_ref
visit_hash $hash_ref
visit_glob $glob_ref
visit_scalar $scalar_ref
These methods are called for the corresponding container type.
visit_value $value
If the value is anything else, this method is called. The base implementation will return $value.
visit_hash_entry $key, $value, $hash
Delegates to "visit_hash_key" and "visit_hash_value". The value is passed as $_[2] so that it is aliased.
visit_hash_key $key, $value, $hash
Calls "visit" on the key and returns it.
visit_hash_value $value, $key, $hash
The value will be aliased (passed as $_[1]).
visit_array_entry $value, $index, $array
Delegates to "visit" on value. The value is passed as $_[1] to retain aliasing.
visit_tied $object, $var
When "tied_as_objects" is enabled and a tied variable (hash, array, glob or scalar) is encountered this method will be called on the tied object. If a valid mapped value is returned, the newly constructed result container will be tied to the return value and no iteration of the contents of the data will be made (since all storage is delegated to the tied object).

If a non blessed value is returned from "visit_tied" then the structure will be iterated normally, and the result container will not be tied at all.

This is because tying to the same class and performing the tie operations will not yield the same results in many cases.

RETURN VALUE

This object can be used as an "fmap" of sorts - providing an ad-hoc functor interface for Perl data structures.

In void context this functionality is ignored, but in any other context the default methods will all try to return a value of similar structure, with it's children also fmapped.

SUBCLASSING

Create instance data using the Class::Accessor interface. Data::Visitor inherits Class::Accessor to get a sane "new".

Then override the callback methods in any way you like. To retain visitor behavior, make sure to retain the functionality of "visit_array" and "visit_hash".

TODO

Add support for ``natural'' visiting of trees.
Expand "retain_magic" to support tying at the very least, or even more with Variable::Magic if possible.

SEE ALSO

Data::Rmap, Tree::Simple::VisitorFactory, Data::Traverse

<http://en.wikipedia.org/wiki/Visitor_pattern>, <http://www.ninebynine.org/Software/Learning-Haskell-Notes.html#functors>, <http://en.wikipedia.org/wiki/Functor>

AUTHOR

Yuval Kogman <nothingmuch@woobling.org>
         Copyright (c) 2006-2008 Yuval Kogman. All rights reserved
         This program is free software; you can redistribute
         it and/or modify it under the same terms as Perl itself.