diff Lib/IMPL/clone.pm @ 175:9057e4b95d10

corrected cloning method
author sourcer
date Wed, 05 Oct 2011 00:48:43 +0300
parents d920d2b70230
children 47dac58691ee
line wrap: on
line diff
--- a/Lib/IMPL/clone.pm	Tue Oct 04 17:55:38 2011 +0400
+++ b/Lib/IMPL/clone.pm	Wed Oct 05 00:48:43 2011 +0300
@@ -10,7 +10,7 @@
 		HASH => sub {
 			my $class = blessed($_[0]);
 			
-			my $new = {};
+			my $new = $_[1]->{ refaddr($_[0]) } = {};
 			while (my ($key,$val) = each %{$_[0]}) {
 				$new->{$key} = clone($val,$_[1]);
 			}
@@ -18,7 +18,12 @@
 		},
 		ARRAY => sub {
 			my $class = blessed($_[0]);
-			$class ? bless( [ map clone($_,$_[1]), @{$_[0]} ], $class ) : [ map clone($_), @{$_[0]} ];
+			
+			my $new = $_[1]->{ refaddr($_[0]) } = [];
+			
+			push @$new, clone($_,$_[1]) foreach @{$_[0]};
+			
+			$class ? bless( $new, $class ) : $new;
 		},
 		SCALAR => sub {
 			my $class = blessed($_[0]);
@@ -28,7 +33,9 @@
 		},
 		REF => sub {
 			my $class = blessed($_[0]);
-			my $v = clone ( ${$_[0]},$_[1] );
+			my $v;
+			my $new = $_[1]->{ refaddr($_[0]) } = \$v;
+			$v = clone ( ${$_[0]},$_[1] );
 			$class ? bless \$v, $class : \$v;
 			
 		},
@@ -42,7 +49,7 @@
 		
 		return $_[0] unless ref $_[0];
 		
-		return $_[1]->{refaddr($_[0])} ||= ($handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->($_[0]);
+		return $_[1]->{refaddr($_[0])} || ($handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->(@_);
 	}
 	
 }