r23492 - in /trunk/libdata-visitor-perl: Changes META.yml Makefile.PL SIGNATURE debian/changelog lib/Data/Visitor.pm lib/Data/Visitor/Callback.pm t/circular_refs.t

ghostbar-guest at users.alioth.debian.org ghostbar-guest at users.alioth.debian.org
Tue Jul 22 04:53:56 UTC 2008


Author: ghostbar-guest
Date: Tue Jul 22 04:53:53 2008
New Revision: 23492

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=23492
Log:
* New upstream release

Modified:
    trunk/libdata-visitor-perl/Changes
    trunk/libdata-visitor-perl/META.yml
    trunk/libdata-visitor-perl/Makefile.PL
    trunk/libdata-visitor-perl/SIGNATURE
    trunk/libdata-visitor-perl/debian/changelog
    trunk/libdata-visitor-perl/lib/Data/Visitor.pm
    trunk/libdata-visitor-perl/lib/Data/Visitor/Callback.pm
    trunk/libdata-visitor-perl/t/circular_refs.t

Modified: trunk/libdata-visitor-perl/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/Changes?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/Changes (original)
+++ trunk/libdata-visitor-perl/Changes Tue Jul 22 04:53:53 2008
@@ -1,3 +1,6 @@
+0.18
+	- Weak reference support
+
 0.17
 	- More void context correctness fixes WRT tied values
 	- Overzealous seen value mappings made by Callback were removed

Modified: trunk/libdata-visitor-perl/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/META.yml?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/META.yml (original)
+++ trunk/libdata-visitor-perl/META.yml Tue Jul 22 04:53:53 2008
@@ -1,13 +1,16 @@
 --- #YAML:1.0
 name:                Data-Visitor
-version:             0.17
+version:             0.18
 abstract:            ~
 license:             ~
 author:              ~
 generated_by:        ExtUtils::MakeMaker version 6.44
 distribution_type:   module
 requires:     
-    Class::Accessor:               0
+    Data::Alias:                   0
+    Mouse:                         0.04
+    namespace::clean:              0.08
+    Task::Weaken:                  0
     Test::MockObject:              1.04
     Test::More:                    0
     Test::use::ok:                 0

Modified: trunk/libdata-visitor-perl/Makefile.PL
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/Makefile.PL?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/Makefile.PL (original)
+++ trunk/libdata-visitor-perl/Makefile.PL Tue Jul 22 04:53:53 2008
@@ -5,11 +5,14 @@
 	'NAME' => 'Data::Visitor',
 	'VERSION_FROM' => 'lib/Data/Visitor.pm',
 	'PREREQ_PM' => {
-		'Class::Accessor'  => '0',
+		'Mouse'            => '0.04',
+		'namespace::clean' => '0.08',
 		'Test::MockObject' => '1.04',
 		'Test::More'       => '0',
 		'Test::use::ok'    => '0',
 		'Tie::ToObject'    => '0.01',
+		'Data::Alias'      => '0', # deref
+		'Task::Weaken'     => '0',
 	},
 	'INSTALLDIRS' => 'site',
 	'PL_FILES'    => {},

Modified: trunk/libdata-visitor-perl/SIGNATURE
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/SIGNATURE?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/SIGNATURE (original)
+++ trunk/libdata-visitor-perl/SIGNATURE Tue Jul 22 04:53:53 2008
@@ -14,24 +14,24 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-SHA1 0e2884144c30d1570281a34f27d49f8541518e7a Changes
+SHA1 f76d5269f3c5313694113e8b3362256c8f670336 Changes
 SHA1 f0cf3ccc1cd7b0f3215f358edc7fa0099b437aba MANIFEST
 SHA1 ddb918d4e02cc06f4b9fe77adeca65403f8fdd56 MANIFEST.SKIP
-SHA1 1b052f87f5a7653682e9cee2d894ddee979a3be6 META.yml
-SHA1 667bc3455c456f2f3bf2ba21eaf728c93057d253 Makefile.PL
-SHA1 a0b3f7ec66e1b212a685377b780d12bbc1449a67 lib/Data/Visitor.pm
-SHA1 f4787d6f132bc389bc9c74809969b9c6a18044af lib/Data/Visitor/Callback.pm
+SHA1 b14f53f397db61e88961db37ad435608cda2a610 META.yml
+SHA1 bd5e62254be119a314ca4ecbc82232acf7228558 Makefile.PL
+SHA1 c8c41789cb077f2b6492c0a74b77689eda948cc6 lib/Data/Visitor.pm
+SHA1 b0091166f97f2a8ec098746a3d44f3c051361eaa lib/Data/Visitor/Callback.pm
 SHA1 dfba09a3df7adaf6d0369a4745e6e336272c405d t/base.t
 SHA1 257c858e1bc12c1039e93cac62a0d37f2e0d804d t/bugs.t
 SHA1 e4b813021fa680c61cb4229a9ddeb0a22ec5bf82 t/callback.t
 SHA1 3836b0eeb006cc4984e80dec1a537b808c3173d2 t/callback_aliasing.t
-SHA1 b36e070cd6929ab17feab46e6265729c901cc394 t/circular_refs.t
+SHA1 ba502603afe759f9f22026c8c6527d1753fa6174 t/circular_refs.t
 SHA1 54affd2088fa25d8eec562fb8d39e1abd0d123c7 t/globs.t
 SHA1 a3a3ead5cdb91a600fb6c7ae585bfe98fcf82bbf t/magic.t
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.7 (Darwin)
 
-iD8DBQFIgi+YVCwRwOvSdBgRAuauAJ4+WcizMBKaeWyFSVz9B5V7C+m2IwCfQECi
-wQy0Fj1Pbsx5EaKQHisUHDY=
-=7VJK
+iD8DBQFIhOUwVCwRwOvSdBgRApvLAKCKFXUZ3qfYxnng0OOorUj1J4TtCgCgsfgL
+8galJKWH8Cq5i8uoRRtKJGw=
+=h2wC
 -----END PGP SIGNATURE-----

Modified: trunk/libdata-visitor-perl/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/debian/changelog?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/debian/changelog (original)
+++ trunk/libdata-visitor-perl/debian/changelog Tue Jul 22 04:53:53 2008
@@ -1,3 +1,9 @@
+libdata-visitor-perl (0.18-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Jose Luis Rivas <ghostbar38 at gmail.com>  Tue, 22 Jul 2008 00:23:16 -0430
+
 libdata-visitor-perl (0.17-1) unstable; urgency=low
 
   * New upstream release.

Modified: trunk/libdata-visitor-perl/lib/Data/Visitor.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/lib/Data/Visitor.pm?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/lib/Data/Visitor.pm (original)
+++ trunk/libdata-visitor-perl/lib/Data/Visitor.pm Tue Jul 22 04:53:53 2008
@@ -1,21 +1,32 @@
 #!/usr/bin/perl
 
 package Data::Visitor;
-use base qw/Class::Accessor/;
-
-use strict;
-use warnings;
-
-use Scalar::Util qw/blessed refaddr reftype/;
+use Squirrel;
+
+use Scalar::Util qw/blessed refaddr reftype weaken isweak/;
 use overload ();
 use Symbol ();
 
 use Tie::ToObject;
 
-__PACKAGE__->mk_accessors(qw(tied_as_objects));
-
-# the double not works makes this no longer undef, so exempt from useless constant warnings in older perls
+use namespace::clean -except => 'meta';
+
+# the double not makes this no longer undef, so exempt from useless constant warnings in older perls
 use constant DEBUG => not not our $DEBUG || $ENV{DATA_VISITOR_DEBUG};
+
+our $VERSION = "0.18";
+
+has tied_as_objects => (
+	isa => "Bool",
+	is  => "rw",
+);
+
+# currently broken
+has weaken => (
+	isa => "Bool",
+	is  => "rw",
+	default => 0,
+);
 
 sub trace {
 	my ( $self, $category, @msg ) = @_;
@@ -35,8 +46,6 @@
 	warn "@msg\n";
 }
 
-our $VERSION = "0.17";
-
 sub visit {
 	my ( $self, $data ) = @_;
 
@@ -45,15 +54,18 @@
 
 	my $seen_hash = local $self->{_seen} = ($self->{_seen} || {}); # delete it after we're done with the whole visit
 	if ( ref $data ) { # only references need recursion checks
+
+		$seen_hash->{weak} ||= isweak($_[1]) if $self->weaken;
+
 		if ( exists $seen_hash->{ refaddr($data) } ) {
 			$self->trace( mapping => found_mapping => from => $data, to => $seen_hash->{ refaddr($data) } ) if DEBUG;
-			return $self->visit_seen( $data, $seen_hash->{refaddr($data)} );
+			return $self->visit_seen( $_[1], $seen_hash->{refaddr($data)} );
 		} else {
 			$self->trace( mapping => no_mapping => $data ) if DEBUG;
 		}
 	}
 
-	return $self->visit_no_rec_check( $data );
+	return $self->visit_no_rec_check( $_[1] );
 }
 
 sub visit_seen {
@@ -77,18 +89,25 @@
 	my ( $self, $data ) = @_;
 
 	if ( blessed($data) ) {
-		return $self->visit_object($data);
+		return $self->visit_object($_[1]);
 	} elsif ( ref $data ) {
-		return $self->visit_ref($data);
-	}
-
-	return $self->visit_value($data);
+		return $self->visit_ref($_[1]);
+	}
+
+	return $self->visit_value($_[1]);
 }
 
 sub visit_object {
 	my ( $self, $object ) = @_;
 	$self->trace( flow => visit_object => $object ) if DEBUG;
-	return $self->_register_mapping( $object, $self->visit_value($object) );
+
+	if ( not defined wantarray ) {
+		$self->_register_mapping( $object, $object );
+		$self->visit_value($_[1]);
+		return;
+	} else {
+		return $self->_register_mapping( $object, $self->visit_value($_[1]) );
+	}
 }
 
 sub visit_ref {
@@ -104,7 +123,7 @@
 
 	my $method = $self->can(lc "visit_$reftype") || "visit_value";
 
-	return $self->$method($data);
+	return $self->$method($_[1]);
 }
 
 sub visit_value {
@@ -123,9 +142,9 @@
 
 		my $tied = tied(%$hash);
 		if ( ref($tied) and $self->tied_as_objects ) {
-			$self->visit_tied($tied, $hash);
-		} else {
-			$self->visit_hash_entries($hash);
+			$self->visit_tied(tied(%$hash), $_[1]);
+		} else {
+			$self->visit_hash_entries($_[1]);
 		}
 
 		return;
@@ -134,14 +153,14 @@
 		$self->_register_mapping( $hash, $new_hash );
 
 		my $tied = tied(%$hash);
-		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $hash)) ) {
+		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied(%$hash), $_[1])) ) {
 			$self->trace( data => tying => var => $new_hash, to => $new_tied ) if DEBUG;
 			tie %$new_hash, 'Tie::ToObject', $new_tied;
 		} else {
-			%$new_hash = $self->visit_hash_entries($hash);
-		}
-
-		return $self->retain_magic( $hash, $new_hash );
+			%$new_hash = $self->visit_hash_entries($_[1]);
+		}
+
+		return $self->retain_magic( $_[1], $new_hash );
 	}
 }
 
@@ -162,11 +181,11 @@
 
 	if ( not defined wantarray ) {
 		$self->visit_hash_key($key,$value,$hash);
-		$self->visit_hash_value($_[2],$key,$hash); # retain aliasing semantics
+		$self->visit_hash_value($_[2],$key,$hash);
 	} else {
 		return (
 			$self->visit_hash_key($key,$value,$hash),
-			$self->visit_hash_value($_[2],$key,$hash) # retain aliasing semantics
+			$self->visit_hash_value($_[2],$key,$hash),
 		);
 	}
 }
@@ -178,7 +197,7 @@
 
 sub visit_hash_value {
 	my ( $self, $value, $key, $hash ) = @_;
-	$self->visit($_[1]); # retain it's aliasing semantics
+	$self->visit($_[1]);
 }
 
 sub visit_array {
@@ -189,9 +208,9 @@
 
 		my $tied = tied(@$array);
 		if ( ref($tied) and $self->tied_as_objects ) {
-			$self->visit_tied($tied, $array);
-		} else {
-			$self->visit_array_entries($array);
+			$self->visit_tied(tied(@$array), $_[1]);
+		} else {
+			$self->visit_array_entries($_[1]);
 		}
 
 		return;
@@ -200,14 +219,14 @@
 		$self->_register_mapping( $array, $new_array );
 
 		my $tied = tied(@$array);
-		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $array)) ) {
+		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied(@$array), $_[1])) ) {
 			$self->trace( data => tying => var => $new_array, to => $new_tied ) if DEBUG;
-			tie @$new_array, 'Data::Visitor::TieToObject', $new_tied;
-		} else {
-			@$new_array = $self->visit_array_entries($array);
-		}
-
-		return $self->retain_magic( $array, $new_array );
+			tie @$new_array, 'Tie::ToObject', $new_tied;
+		} else {
+			@$new_array = $self->visit_array_entries($_[1]);
+		}
+
+		return $self->retain_magic( $_[1], $new_array );
 	}
 }
 
@@ -234,7 +253,7 @@
 
 		my $tied = tied($$scalar);
 		if ( ref($tied) and $self->tied_as_objects ) {
-			$self->visit_tied($tied, $scalar);
+			$self->visit_tied(tied($$scalar), $_[1]);
 		} else {
 			$self->visit($$scalar);
 		}
@@ -245,20 +264,20 @@
 		$self->_register_mapping( $scalar, \$new_scalar );
 
 		my $tied = tied($$scalar);
-		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $scalar)) ) {
+		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied($$scalar), $_[1])) ) {
 			$self->trace( data => tying => var => $new_scalar, to => $new_tied ) if DEBUG;
-			tie $new_scalar, 'Data::Visitor::TieToObject', $new_tied;
+			tie $new_scalar, 'Tie::ToObject', $new_tied;
 		} else {
 			$new_scalar = $self->visit( $$scalar );
 		}
 
-		return $self->retain_magic( $scalar, \$new_scalar );
+		return $self->retain_magic( $_[1], \$new_scalar );
 	}
 }
 
 sub visit_code {
 	my ( $self, $code ) = @_;
-	$self->visit_value($code);
+	$self->visit_value($_[1]);
 }
 
 sub visit_glob {
@@ -269,7 +288,7 @@
 
 		my $tied = tied(*$glob);
 		if ( ref($tied) and $self->tied_as_objects ) {
-			$self->visit_tied($tied, $glob);
+			$self->visit_tied(tied(*$glob), $_[1]);
 		} else {
 			$self->visit( *$glob{$_} || next ) for qw/SCALAR ARRAY HASH/;
 		}
@@ -281,15 +300,15 @@
 		$self->_register_mapping( $glob, $new_glob );
 
 		my $tied = tied(*$glob);
-		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied($tied, $glob)) ) {
+		if ( ref($tied) and $self->tied_as_objects and blessed(my $new_tied = $self->visit_tied(tied(*$glob), $_[1])) ) {
 			$self->trace( data => tying => var => $new_glob, to => $new_tied ) if DEBUG;
-			tie *$new_glob, 'Data::Visitor::TieToObject', $new_tied;
+			tie *$new_glob, 'Tie::ToObject', $new_tied;
 		} else {
 			no warnings 'misc'; # Undefined value assigned to typeglob
 			*$new_glob = $self->visit( *$glob{$_} || next ) for qw/SCALAR ARRAY HASH/;
 		}
 
-		return $self->retain_magic( $glob, $new_glob );
+		return $self->retain_magic( $_[1], $new_glob );
 	}
 }
 
@@ -301,6 +320,28 @@
 		bless $new, ref $proto;
 	}
 
+	my $seen_hash = $self->{_seen};
+	if ( $seen_hash->{weak} ) {
+		require Data::Alias;
+
+		my @weak_refs;
+		foreach my $value ( Data::Alias::deref($proto) ) {
+			if ( ref $value and isweak($value) ) {
+				push @weak_refs, refaddr $value;
+			}
+		}
+
+		if ( @weak_refs ) {
+			my %targets = map { refaddr($_) => 1 } @{ $self->{_seen} }{@weak_refs};
+			foreach my $value ( Data::Alias::deref($new) ) {
+				if ( ref $value and $targets{refaddr($value)}) {
+					push @{ $seen_hash->{weakened} ||= [] }, $value; # keep a ref around
+					weaken($value);
+				}
+			}
+		}
+	}
+
 	# FIXME real magic, too
 
 	return $new;
@@ -309,10 +350,12 @@
 sub visit_tied {
 	my ( $self, $tied, $var ) = @_;
 	$self->trace( flow => visit_tied => $tied ) if DEBUG;
-	$self->visit($tied); # as an object eventually
-}
-
-__PACKAGE__;
+	$self->visit($_[1]); # as an object eventually
+}
+
+__PACKAGE__->meta->make_immutable if __PACKAGE__->meta->can("make_immutable");
+
+__PACKAGE__
 
 __END__
 
@@ -328,15 +371,21 @@
 	# You probably want to use Data::Visitor::Callback for trivial things
 
 	package FooCounter;
-	use base qw/Data::Visitor/;
-
-	BEGIN { __PACKAGE__->mk_accessors( "number_of_foos" ) };
+	use Mouse;
+
+	extends qw(Data::Visitor);
+
+	has number_of_foos => (
+		isa => "Int",
+		is  => "rw",
+		default => 0,
+	);
 
 	sub visit_value {
 		my ( $self, $data ) = @_;
 
 		if ( defined $data and $data eq "foo" ) {
-			$self->number_of_foos( ($self->number_of_foos || 0) + 1 );
+			$self->number_of_foos( $self->number_of_foos + 1 );
 		}
 
 		return $data;

Modified: trunk/libdata-visitor-perl/lib/Data/Visitor/Callback.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/lib/Data/Visitor/Callback.pm?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/lib/Data/Visitor/Callback.pm (original)
+++ trunk/libdata-visitor-perl/lib/Data/Visitor/Callback.pm Tue Jul 22 04:53:53 2008
@@ -1,19 +1,38 @@
 #!/usr/bin/perl
 
 package Data::Visitor::Callback;
-use base qw/Data::Visitor/;
-
-use strict;
-use warnings;
+use Squirrel;
+
+use Data::Visitor ();
 
 use Carp qw(carp);
 use Scalar::Util qw/blessed refaddr reftype/;
 
-__PACKAGE__->mk_accessors( qw/callbacks class_callbacks ignore_return_values/ );
+use namespace::clean -except => 'meta';
 
 use constant DEBUG => Data::Visitor::DEBUG();
 use constant FIVE_EIGHT => ( $] >= 5.008 );
 
+extends qw(Data::Visitor);
+
+has callbacks => (
+	isa => "HashRef",
+	is  => "rw",
+	default => sub { {} },
+);
+
+has class_callbacks => (
+	isa => "ArrayRef",
+	is  => "rw",
+	default => sub { [] },
+);
+
+has ignore_return_values => (
+	isa => "Bool",
+	is  => "rw",
+);
+
+# FIXME BUILDARGS
 sub new {
 	my ( $class, %callbacks ) = @_;
 
@@ -121,6 +140,23 @@
 	$data;
 }
 
+sub visit_scalar {
+	my ( $self, $data ) = @_;
+	my $new_data = $self->callback_and_reg( scalar => $data );
+	if ( (reftype($new_data)||"") =~ /^(?: SCALAR | REF | LVALUE | VSTRING ) $/x ) {
+		my $visited = $self->SUPER::visit_scalar( $new_data );
+
+		no warnings "uninitialized";
+		if ( refaddr($visited) != refaddr($data) ) {
+			return $self->_register_mapping( $data, $visited );
+		} else {
+			return $visited;
+		}
+	} else {
+		return $self->_register_mapping( $data, $self->visit( $new_data ) );
+	}
+}
+
 sub subname { $_[1] }
 
 BEGIN {
@@ -130,7 +166,7 @@
 		*subname = \&Sub::Name::subname;
 	};
 
-	foreach my $reftype ( qw/array hash glob scalar code/ ) {
+	foreach my $reftype ( qw/array hash glob code/ ) {
 		my $name = "visit_$reftype";
 		no strict 'refs';
 		*$name = subname(__PACKAGE__ . "::$name", eval '
@@ -186,7 +222,9 @@
 	$self->SUPER::visit_tied( $self->callback_and_reg( tied => $tied, @args ), @args );
 }
 
-__PACKAGE__;
+__PACKAGE__->meta->make_immutable if __PACKAGE__->meta->can("make_immutable");
+
+__PACKAGE__
 
 __END__
 
@@ -203,6 +241,7 @@
 	my $v = Data::Visitor::Callback->new(
 		value => sub { ... },
 		array => sub { ... },
+		object => "visit_ref", # can also use method names
 	);
 
 	$v->visit( $some_perl_value );
@@ -333,6 +372,12 @@
 Called on the return value of C<tied> for all tied containers. Also passes in
 the variable as the second argument.
 
+=item seen
+
+Called for a reference value encountered a second time.
+
+Passes in the result mapping as the second argument.
+
 =back
 
 =head1 AUTHOR

Modified: trunk/libdata-visitor-perl/t/circular_refs.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libdata-visitor-perl/t/circular_refs.t?rev=23492&op=diff
==============================================================================
--- trunk/libdata-visitor-perl/t/circular_refs.t (original)
+++ trunk/libdata-visitor-perl/t/circular_refs.t Tue Jul 22 04:53:53 2008
@@ -3,36 +3,39 @@
 use strict;
 use warnings;
 
-use Test::More tests => 12;
+use Test::More tests => 18;
 
+use Scalar::Util qw(refaddr);
 
 use ok "Data::Visitor";
 use ok "Data::Visitor::Callback";
 
-my $structure = {
-	foo => {
-		bar => undef,
-	},
-};
+{
+	my $structure = {
+		foo => {
+			bar => undef,
+		},
+	};
 
-$structure->{foo}{bar} = $structure;
+	$structure->{foo}{bar} = $structure;
 
-my $o = Data::Visitor->new;
+	my $o = Data::Visitor->new;
 
-{
-	alarm 1;
-	$o->visit( $structure );
-	alarm 0;
-	pass( "circular structures don't cause an endless loop" );
+	{
+		alarm 1;
+		$o->visit( $structure );
+		alarm 0;
+		pass( "circular structures don't cause an endless loop" );
+	}
+
+	is_deeply( $o->visit( $structure ), $structure, "Structure recreated" );
+
+	is( $structure, $structure->{foo}{bar}, "circular address" );
+
+	my $visited = $o->visit( $structure );
+
+	is( $visited, $visited->{foo}{bar}, "circular address" );
 }
-
-is_deeply( $o->visit( $structure ), $structure, "Structure recreated" );
-
-is( $structure, $structure->{foo}{bar}, "circular address" );
-
-my $visited = $o->visit( $structure );
-
-is( $visited, $visited->{foo}{bar}, "circular address" );
 
 {
 	my $orig = {
@@ -113,3 +116,37 @@
 		"seen callback",
 	);
 }
+
+{
+	my $orig = {
+		foo => { bar => 42 },
+	};
+
+	$orig->{bar} = \( $orig->{foo}{bar} );
+
+	is( refaddr($orig->{bar}), refaddr( \( $orig->{foo}{bar} ) ), "scalar ref to hash element" );
+
+	my $copy = Data::Visitor->new->visit($orig);
+
+	is_deeply( $copy, $orig, "structures eq deeply" );
+
+	local $TODO = "hash/array elements are not yet references internally";
+	is( refaddr($copy->{bar}), refaddr( \($copy->{foo}{bar}) ), "scalar ref in copy" );
+}
+
+{
+	my $orig = {
+		foo => 42,
+	};
+
+	$orig->{bar} = \( $orig->{foo} );
+
+	is( refaddr($orig->{bar}), refaddr( \( $orig->{foo} ) ), "scalar ref to sibling hash element" );
+
+	my $copy = Data::Visitor->new->visit($orig);
+
+	is_deeply( $copy, $orig, "structures eq deeply" );
+
+	local $TODO = "hash/array elements are not yet references internally";
+	is( refaddr($copy->{bar}), refaddr( \($copy->{foo}) ), "scalar ref in copy" );
+}




More information about the Pkg-perl-cvs-commits mailing list