comparison Lib/IMPL/clone.pm @ 194:4d0e1962161c

Replaced tabs with spaces IMPL::Web::View - fixed document model, new features (control classes, document constructor parameters)
author cin
date Tue, 10 Apr 2012 20:08:29 +0400
parents 47dac58691ee
children
comparison
equal deleted inserted replaced
193:8e8401c0aea4 194:4d0e1962161c
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 {
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 = $_[1]->{ refaddr($_[0]) } = {}; 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 21
22 my $new = $_[1]->{ refaddr($_[0]) } = []; 22 my $new = $_[1]->{ refaddr($_[0]) } = [];
23 23
24 push @$new, clone($_,$_[1]) foreach @{$_[0]}; 24 push @$new, clone($_,$_[1]) foreach @{$_[0]};
25 25
26 $class ? bless( $new, $class ) : $new; 26 $class ? bless( $new, $class ) : $new;
27 }, 27 },
28 SCALAR => sub { 28 SCALAR => sub {
29 my $class = blessed($_[0]); 29 my $class = blessed($_[0]);
30 30
31 my $v = ${$_[0]}; 31 my $v = ${$_[0]};
32 $class ? bless \$v, $class : \$v; 32 $class ? bless \$v, $class : \$v;
33 }, 33 },
34 REF => sub { 34 REF => sub {
35 my $class = blessed($_[0]); 35 my $class = blessed($_[0]);
36 my $v; 36 my $v;
37 my $new = $_[1]->{ refaddr($_[0]) } = \$v; 37 my $new = $_[1]->{ refaddr($_[0]) } = \$v;
38 $v = clone ( ${$_[0]},$_[1] ); 38 $v = clone ( ${$_[0]},$_[1] );
39 $class ? bless \$v, $class : \$v; 39 $class ? bless \$v, $class : \$v;
40 40
41 }, 41 },
42 REGEXP => sub { 42 REGEXP => sub {
43 $_[0]; 43 $_[0];
44 } 44 }
45 ); 45 );
46 46
47 sub clone { 47 sub clone {
48 return unless @_; 48 return unless @_;
49 49
50 return $_[0] unless ref $_[0]; 50 return $_[0] unless ref $_[0];
51 51
52 return $_[1]->{refaddr($_[0])} || (UNIVERSAL::can($_[0],'_clone') || $handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->(@_); 52 return $_[1]->{refaddr($_[0])} || (UNIVERSAL::can($_[0],'_clone') || $handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->(@_);
53 } 53 }
54 54
55 } 55 }
56 56
57 1; 57 1;