comparison Lib/IMPL/clone.pm @ 174:d920d2b70230

minor changes
author sergey
date Tue, 04 Oct 2011 17:55:38 +0400
parents aaab45153411
children 9057e4b95d10
comparison
equal deleted inserted replaced
173:aaab45153411 174:d920d2b70230
1 package IMPL::clone; 1 package IMPL::clone;
2 2
3 use Scalar::Util qw(blessed reftype); 3 use Scalar::Util qw(blessed reftype refaddr);
4 4
5 use base qw(Exporter); 5 use base qw(Exporter);
6 our @EXPORT_OK = qw(&clone); 6 our @EXPORT_OK = qw(&clone);
7 7
8 { 8 {
10 HASH => sub { 10 HASH => sub {
11 my $class = blessed($_[0]); 11 my $class = blessed($_[0]);
12 12
13 my $new = {}; 13 my $new = {};
14 while (my ($key,$val) = each %{$_[0]}) { 14 while (my ($key,$val) = each %{$_[0]}) {
15 $new->{$key} = clone($val); 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($_), @{$_[0]} ], $class ) : [ map clone($_), @{$_[0]} ]; 21 $class ? bless( [ map clone($_,$_[1]), @{$_[0]} ], $class ) : [ map clone($_), @{$_[0]} ];
22 }, 22 },
23 SCALAR => sub { 23 SCALAR => sub {
24 my $class = blessed($_[0]); 24 my $class = blessed($_[0]);
25 25
26 my $v = ${$_[0]}; 26 my $v = ${$_[0]};
27 $class ? bless \$v, $class : \$v; 27 $class ? bless \$v, $class : \$v;
28 }, 28 },
29 REF => sub { 29 REF => sub {
30 my $class = blessed($_[0]); 30 my $class = blessed($_[0]);
31 my $v = clone ( ${$_[0]} ); 31 my $v = clone ( ${$_[0]},$_[1] );
32 $class ? bless \$v, $class : \$v; 32 $class ? bless \$v, $class : \$v;
33 33
34 }, 34 },
35 REGEXP => sub { 35 REGEXP => sub {
36 $_[0]; 36 $_[0];
37 } 37 }
38 ); 38 );
39
39 sub clone { 40 sub clone {
40 return unless @_; 41 return unless @_;
41 42
42 return $_[0] unless ref $_[0]; 43 return $_[0] unless ref $_[0];
43 44
44 return ($handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->($_[0]); 45 return $_[1]->{refaddr($_[0])} ||= ($handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->($_[0]);
45 } 46 }
47
46 } 48 }
47 49
48 1; 50 1;