| Data::Visitor - Visitor style traversal of Perl data structures |
Data::Visitor - Visitor style traversal of Perl data structures
# 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
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.
visit calls this method. The base
implementation will just forward to visit_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.
Create instance data using the the Class::Accessor manpage interface. the Data::Visitor manpage
inherits the Class::Accessor manpage 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.
the Tree::Simple::VisitorFactory manpage, the Data::Traverse manpage
http://en.wikipedia.org/wiki/Visitor_pattern, http://www.ninebynine.org/Software/Learning-Haskell-Notes.html#functors, http://en.wikipedia.org/wiki/Functor
Yuval Kogman <nothingmuch@woobling.org>
Copyright (c) 2006 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.
| Data::Visitor - Visitor style traversal of Perl data structures |