Commit | Line | Data |
0373380c |
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; |