break tracer.pl out into multifarious manifoldly marvelous modules
[gitmo/MooseX-Antlers.git] / lib / MooseX / Antlers / Visitor / NameTracking.pm
CommitLineData
0373380c 1package MooseX::Antlers::Visitor::NameTracking;
2
3use Moose::Role;
4use B qw(perlstring);
5use namespace::clean -except => 'meta';
6
7has '_current_trace_name' => (is => 'ro');
8has 'root_name' => (is => 'ro');
9
10around visit => sub {
11 my ($orig, $self) = (shift, shift);
12 local $self->{_current_trace_name}
13 = ($self->{_current_trace_name}||$self->root_name);
14 return $self->$orig(@_);
15};
16
17around visit_hash_entry => sub {
18 my ($orig, $self) = (shift, shift);
19 my $key = $_[0]; # $key, $value
20 local $self->{_current_trace_name}
21 = $self->{_current_trace_name}.'->{'.(perlstring $key).'}';
22 return $self->$orig(@_);
23};
24
25around visit_array_entry => sub {
26 my ($orig, $self) = (shift, shift);
27 my $index = $_[1]; # $value, $index
28 local $self->{_current_trace_name}
29 = $self->{_current_trace_name}.'->['.$index.']';
30 return $self->$orig(@_);
31};
32
33around visit_scalar => sub {
34 my ($orig, $self) = (shift, shift);
35 local $self->{_current_trace_name} = '${'.$self->{_current_trace_name}.'}';
36 return $self->$orig(@_);
37};
38
391;