Codebase list libdata-visitor-perl / upstream/0.05
Load /tmp/tmp.QB07PS/libdata-visitor-perl-0.05 into packages/libdata-visitor-perl/branches/upstream/current. Krzysztof Krzyzaniak 18 years ago
7 changed file(s) with 103 addition(s) and 26 deletion(s). Raw diff Collapse all Expand all
0 0.05
1 - Added support for using class names as callbacks in
2 Data::Visitor::Callback
3 - Improved semantics of multiple instances of the same reference in a depe
4 structure (will be mapped once, same mapped value used per each instance)
5
06 0.04
17 - Specified that the Test::MockObject dep need 1.04
28
00 ---
11 name: Data-Visitor
2 version: 0.04
2 version: 0.05
33 author:
44 - 'Yuval Kogman <nothingmuch@woobling.org>'
55 abstract: Visitor style traversal of Perl data structures
1414 provides:
1515 Data::Visitor:
1616 file: lib/Data/Visitor.pm
17 version: 0.04
17 version: 0.05
1818 Data::Visitor::Callback:
1919 file: lib/Data/Visitor/Callback.pm
2020 generated_by: Module::Build version 0.2611
1414 Hash: SHA1
1515
1616 SHA1 06f5b6d95515ba96f5959689229f21b3170f5dfd Build.PL
17 SHA1 92556b1da696ac12d880194f7dc60f5c4b61715d Changes
17 SHA1 53f8448f047d96020f991b32dda4cf8be1226668 Changes
1818 SHA1 a067314adf7a4d16b1576c149abc7621cda096b3 MANIFEST
19 SHA1 1e3c9ba576b12fc0674fa78946d6d8be3d1ec605 META.yml
19 SHA1 c81a2f91d8059165f8c6ebc8622b20dd93d8bf18 META.yml
2020 SHA1 79359b08955f73774b2515dbf25deb7a28195cd3 Makefile.PL
21 SHA1 9e1925d5eb338398d7d3f6d67a3aa2156310dfbb lib/Data/Visitor.pm
22 SHA1 5713e1145bf7b9a3a81564d42e73148b445cb718 lib/Data/Visitor/Callback.pm
21 SHA1 8597a454f955abd8ee6097a1e3301e09d06267af lib/Data/Visitor.pm
22 SHA1 daa5c3b3a4d1b917ddf824805e2b8f81b6d24d63 lib/Data/Visitor/Callback.pm
2323 SHA1 3180f412df2834d1f1c9290e9b8726d0b374afc2 t/base.t
2424 SHA1 257c858e1bc12c1039e93cac62a0d37f2e0d804d t/bugs.t
25 SHA1 915e0a329acabb60b35f61ffef7d97a8bee57da0 t/callback.t
25 SHA1 2ddc55b7127db5216879fce4c165b360923eca18 t/callback.t
2626 SHA1 7e59409671d0147236beef17a6dfdc0997d6a97a t/callback_aliasing.t
27 SHA1 ae984fed9ab572d06d3cdc86f61aa4f1594d2447 t/circular_refs.t
27 SHA1 9f6dff4facaf491f3776fec263d13acd4448de33 t/circular_refs.t
2828 SHA1 54affd2088fa25d8eec562fb8d39e1abd0d123c7 t/globs.t
2929 -----BEGIN PGP SIGNATURE-----
3030 Version: GnuPG v1.4.1 (Darwin)
3131
32 iD8DBQFEL4cNVCwRwOvSdBgRAv8OAJ4t5y8xYgEN29YnZa5dQmsBBiBTfgCffKme
33 L1XdJHBzZdO9e0Vno3xMjoU=
34 =UW9k
32 iD8DBQFESje9VCwRwOvSdBgRAjwhAKC4ZT+AXcfVUWKR8RQOJ3V9rzB/JQCgqmfX
33 IdKDpoCeuMIDi4hYmI9Dc+s=
34 =TXup
3535 -----END PGP SIGNATURE-----
55 use strict;
66 use warnings;
77
8 __PACKAGE__->mk_accessors( qw/callbacks ignore_return_values/ );
8 use Scalar::Util qw/blessed/;
9
10 __PACKAGE__->mk_accessors( qw/callbacks class_callbacks ignore_return_values/ );
911
1012 sub new {
1113 my ( $class, %callbacks ) = @_;
1517 $ignore_ret = delete $callbacks{ignore_return_values};
1618 }
1719
20 my @class_callbacks = grep { $_->can("isa") } keys %callbacks;
21
1822 $class->SUPER::new({
1923 ignore_return_values => $ignore_ret,
2024 callbacks => \%callbacks,
25 class_callbacks => \@class_callbacks,
2126 });
2227 }
2328
3641
3742 sub visit_object {
3843 my ( $self, $data ) = @_;
39 $self->callback( object => $data );
44 $data = $self->callback( object => $data );
45
46 foreach my $class ( @{ $self->class_callbacks } ) {
47 $data = $self->callback( $class => $data ) if $data->isa($class);
48 }
49
50 $data;
4051 }
4152
4253 BEGIN {
4758 my ( $self, $data ) = @_;
4859 my $new_data = $self->callback( '.$reftype.' => $data );
4960 if ( ref $data eq ref $new_data ) {
50 $self->SUPER::visit_'.$reftype.'( $new_data );
61 return $self->SUPER::visit_'.$reftype.'( $new_data );
5162 } else {
52 $self->SUPER::visit( $new_data );
63 return $self->SUPER::visit( $new_data );
5364 }
5465 }
5566 ' || die $@;
156167
157168 Called for blessed objects.
158169
170 =item Some::Class
171
172 You can use any class name as a clalback. This is clled only after the
173 C<object> callback.
174
159175 =item array
160176
161177 Called for array references.
55 use strict;
66 use warnings;
77
8 use Scalar::Util ();
8 use Scalar::Util qw/blessed refaddr/;
99 use overload ();
1010 use Symbol ();
1111
12 our $VERSION = "0.04";
12 our $VERSION = "0.05";
1313
1414 sub visit {
1515 my ( $self, $data ) = @_;
1616
17 local $self->{_seen} = ($self->{_seen} || {});
18 return $data if ref $data and $self->{_seen}{ overload::StrVal( $data ) }++;
19
20 if ( Scalar::Util::blessed( $data ) ) {
17 my $seen_hash = local $self->{_seen} = ($self->{_seen} || {}); # delete it after we're done with the whole visit
18 if ( ref $data ) { # only references need recursion checks
19 if ( exists $seen_hash->{ refaddr( $data ) } ) { # if it's been seen
20 return $seen_hash->{ refaddr( $data ) }; # return whatever it was mapped to
21 } else {
22 my $seen = \( $seen_hash->{ refaddr( $data ) } );
23 $$seen = $data;
24
25 if ( defined wantarray ) {
26 return $$seen = $self->visit_no_rec_check( $data );
27 } else {
28 return $self->visit_no_rec_check( $data );
29 }
30 }
31 } else {
32 return $self->visit_no_rec_check( $data );
33 }
34 }
35
36 sub visit_no_rec_check {
37 my ( $self, $data ) = @_;
38
39 if ( blessed( $data ) ) {
2140 return $self->visit_object( $data );
2241 } elsif ( my $reftype = ref $data ) {
2342 if ( $reftype eq "HASH" or $reftype eq "ARRAY" or $reftype eq "GLOB" or $reftype eq "SCALAR") {
173192 behavior, make sure to retain the functionality of C<visit_array> and
174193 C<visit_hash>.
175194
195 =head1 TODO
196
197 Add support for "natural" visiting of trees.
198
176199 =head1 SEE ALSO
177200
178201 L<Tree::Simple::VisitorFactory>, L<Data::Traverse>
22 use strict;
33 use warnings;
44
5 use Test::More tests => 11;
5 use Test::More tests => 12;
66
77
88 my $m; use ok $m = "Data::Visitor::Callback";
2424 hash
2525 glob
2626 scalar
27 Moose
28 Mammal
2729 ),
2830 );
2931
5860 plain_value => 1,
5961 });
6062
61 counters_are( bless({}, "Moose"), "objecct", {
63 {
64 package Mammal;
65 package Moose;
66 our @ISA = ("Mammal");
67 }
68
69 counters_are( bless({}, "Moose"), "object", {
6270 visit => 1,
6371 object => 1,
72 Moose => 1,
73 Mammal => 1,
74 });
75
76 counters_are( bless({}, "Mammal"), "object", {
77 visit => 1,
78 object => 1,
79 Mammal => 1,
6480 });
6581
6682 counters_are( \10, "scalar_ref", {
22 use strict;
33 use warnings;
44
5 use Test::More tests => 3;
5 use Test::More tests => 5;
66
77
8 my $m; use ok $m = "Data::Visitor";
8 use ok "Data::Visitor";
9 use ok "Data::Visitor::Callback";
910
1011 my $structure = {
1112 foo => {
1516
1617 $structure->{foo}{bar} = $structure;
1718
18 my $o = $m->new;
19 my $o = Data::Visitor->new;
1920
2021 {
2122 alarm 1;
2627
2728 is_deeply( $o->visit( $structure ), $structure, "Structure recreated" );
2829
30
31 my $orig = {
32 one => [ ],
33 two => [ ],
34 };
35
36 $orig->{one}[0] = $orig->{two}[0] = bless {}, "yyy";
37
38 my $c = Data::Visitor::Callback->new(
39 object => sub { bless {}, "zzzzz" },
40 );
41
42 my $copy = $c->visit( $orig );
43
44 is( $copy->{one}[0], $copy->{two}[0], "copy of object is a mapped copy" );