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

corrected cloning method
author sourcer
date Wed, 05 Oct 2011 00:48:43 +0300
parents d920d2b70230
children 47dac58691ee
comparison
equal deleted inserted replaced
174:d920d2b70230 175:9057e4b95d10
8 { 8 {
9 my %handlers = ( 9 my %handlers = (
10 HASH => sub { 10 HASH => sub {
11 my $class = blessed($_[0]); 11 my $class = blessed($_[0]);
12 12
13 my $new = {}; 13 my $new = $_[1]->{ refaddr($_[0]) } = {};
14 while (my ($key,$val) = each %{$_[0]}) { 14 while (my ($key,$val) = each %{$_[0]}) {
15 $new->{$key} = clone($val,$_[1]); 15 $new->{$key} = clone($val,$_[1]);
16 } 16 }
17 $class ? bless $new, $class : $new; 17 $class ? bless $new, $class : $new;
18 }, 18 },
19 ARRAY => sub { 19 ARRAY => sub {
20 my $class = blessed($_[0]); 20 my $class = blessed($_[0]);
21 $class ? bless( [ map clone($_,$_[1]), @{$_[0]} ], $class ) : [ map clone($_), @{$_[0]} ]; 21
22 my $new = $_[1]->{ refaddr($_[0]) } = [];
23
24 push @$new, clone($_,$_[1]) foreach @{$_[0]};
25
26 $class ? bless( $new, $class ) : $new;
22 }, 27 },
23 SCALAR => sub { 28 SCALAR => sub {
24 my $class = blessed($_[0]); 29 my $class = blessed($_[0]);
25 30
26 my $v = ${$_[0]}; 31 my $v = ${$_[0]};
27 $class ? bless \$v, $class : \$v; 32 $class ? bless \$v, $class : \$v;
28 }, 33 },
29 REF => sub { 34 REF => sub {
30 my $class = blessed($_[0]); 35 my $class = blessed($_[0]);
31 my $v = clone ( ${$_[0]},$_[1] ); 36 my $v;
37 my $new = $_[1]->{ refaddr($_[0]) } = \$v;
38 $v = clone ( ${$_[0]},$_[1] );
32 $class ? bless \$v, $class : \$v; 39 $class ? bless \$v, $class : \$v;
33 40
34 }, 41 },
35 REGEXP => sub { 42 REGEXP => sub {
36 $_[0]; 43 $_[0];
40 sub clone { 47 sub clone {
41 return unless @_; 48 return unless @_;
42 49
43 return $_[0] unless ref $_[0]; 50 return $_[0] unless ref $_[0];
44 51
45 return $_[1]->{refaddr($_[0])} ||= ($handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->($_[0]); 52 return $_[1]->{refaddr($_[0])} || ($handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->(@_);
46 } 53 }
47 54
48 } 55 }
49 56
50 1; 57 1;