NAME

Data::DPath::Validator::Visitor - Data::Visitor subclass for generating DPaths

VERSION

version 0.093410

SYNOPSIS

use Data::DPath::Validator::Visitor;
my $v = Data::DPath::Validator::Visitor->new();
$v->visit({foo => '*'});

$v->templates; # [ '/foo/*' ]

DESCRIPTION

Data::DPath::Validator::Visitor subclasses Data::Visitor to parse arbitrary Perl data structures into Data::DPath paths. It stores these paths in its templates attribute.

ATTRIBUTES

templates is: ro, isa: ArrayRef[Str], traits: Array

templates contains the parsed paths from calling visit on template data

handles =>
{
    add_template => 'push'
}

current_template is: ro, isa: Str, default: '', traits: String

current_template holds the template as it is being build prior to being added to the templates attribute

handles =>
{
    append_text => 'append',
    prepend_text => 'prepend',
    reset_template => 'clear',
}

template_stack is: ro, isa: ArrayRef[Str], default: [], traits: Array

template_stack maintains the templates as we branch down the data structure. At each level down, the current template is pushed onto the stack and popped off when the that branch bottom is reached.

handles =>
{
    push_template => 'push',
    pop_template => 'pop',
},

structure_depth is: ro, isa: Int, default: 0, traits: Counter

structure_depth keeps track of how deep we are in the data structure.

handles =>
{
    lower => 'inc',
    higher => 'dec',
},

value_type is: rw, isa: enum ArrayElem HashVal HashKey NONE, default:NONE

value_type keeps track of what kind of element we are viewing inside visit_value. This attribute is important for determining path construction.

METHODS

dive

dive() increases our depth into the data structure, pushing the current template onto the template stack.

rise

rise() decreases our depth from the data structure, popping a template from the template stack and replacing the current_template with it.

visit_value

visit_value is overriden to provide the meat of the DPath generation algorithm. It reads $self->value_type to know how append to the current_template.

around visit_hash

visit_hash is advised to adjust our depth and prep our current template.

After calling the original method, depth is adjusted back.

around visit_hash_key

visit_hash_key is advised to set value_type to HashKey prior to calling the original method

around visit_hash_value

visit_hash_value is advised to set value_type to HashVal prior to calling the original method

around visit_hash_entry

visit_hash_entry is advised to adjust out depth prior to evaluating the key and value.

After calling the original method, depth is adjusted back.

around visit_array

visit_array is advised to adjust our depth and prep our current template.

After calling the original method, depth is adjusted back.

around visit_array_entry

visit_array_entry is advised to set the value_type to ArrayElem and to also prep the current template with the array index before calling the original.

After calling the original method, depth is adjusted back.

around visit

visit is advised to prep the initial template if the structure depth is zero before calling the original. Afterward, if the depth has resolved back to zero, the current template is reset.

AUTHOR

Nicholas Perez <nperez@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2009 by Infinity Interactive.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.