revisiting of changed aggregate structures
Yuval Kogman
18 years ago
42 | 42 |
|
43 | 43 |
sub visit_hash {
|
44 | 44 |
my ( $self, $data ) = @_;
|
45 | |
$self->SUPER::visit_hash( $self->callback( hash => $data ) );
|
|
45 |
my $new_data = $self->callback( hash => $data );
|
|
46 |
if ( ref $data eq ref $new_data ) {
|
|
47 |
$self->SUPER::visit_hash( $new_data );
|
|
48 |
} else {
|
|
49 |
$self->SUPER::visit( $new_data );
|
|
50 |
}
|
46 | 51 |
}
|
47 | 52 |
|
48 | 53 |
sub visit_array {
|
49 | 54 |
my ( $self, $data ) = @_;
|
50 | |
$self->SUPER::visit_array( $self->callback( array => $data ) );
|
|
55 |
my $new_data = $self->callback( array => $data );
|
|
56 |
if ( ref $data eq ref $new_data ) {
|
|
57 |
$self->SUPER::visit_array( $new_data );
|
|
58 |
} else {
|
|
59 |
$self->SUPER::visit( $new_data );
|
|
60 |
}
|
51 | 61 |
}
|
52 | 62 |
|
53 | 63 |
sub callback {
|
2 | 2 |
use strict;
|
3 | 3 |
use warnings;
|
4 | 4 |
|
5 | |
use Test::More tests => 3;
|
|
5 |
use Test::More tests => 4;
|
6 | 6 |
|
7 | 7 |
|
8 | 8 |
my $m; use ok $m = "Data::Visitor::Callback";
|
|
28 | 28 |
}, "values were modified" );
|
29 | 29 |
|
30 | 30 |
is( $_, "original", '$_ unchanged in outer scope');
|
|
31 |
|
|
32 |
$o->callbacks->{hash} = sub { $_ = "value" };
|
|
33 |
$o->visit( $structure );
|
|
34 |
is( $structure, "value", "entire structure can also be changed");
|
|
35 |
|