break tracer.pl out into multifarious manifoldly marvelous modules
[gitmo/MooseX-Antlers.git] / lib / MooseX / Antlers / Visitor / NameTracking.pm
1 package MooseX::Antlers::Visitor::NameTracking;
2
3 use Moose::Role;
4 use B qw(perlstring);
5 use namespace::clean -except => 'meta';
6
7 has '_current_trace_name' => (is => 'ro');
8 has 'root_name' => (is => 'ro');
9
10 around 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
17 around 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
25 around 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
33 around 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
39 1;