Mercurial > pub > Impl
view Lib/IMPL/clone.pm @ 190:cd1ff7029a63
IMLP::Web::View refactored, added new method 'require' which is available inside templates. Changed document rendering.
author | cin |
---|---|
date | Wed, 04 Apr 2012 17:51:27 +0400 |
parents | 47dac58691ee |
children | 4d0e1962161c |
line wrap: on
line source
package IMPL::clone; use Scalar::Util qw(blessed reftype refaddr); use base qw(Exporter); our @EXPORT_OK = qw(&clone); { my %handlers = ( HASH => sub { my $class = blessed($_[0]); my $new = $_[1]->{ refaddr($_[0]) } = {}; while (my ($key,$val) = each %{$_[0]}) { $new->{$key} = clone($val,$_[1]); } $class ? bless $new, $class : $new; }, ARRAY => sub { my $class = blessed($_[0]); my $new = $_[1]->{ refaddr($_[0]) } = []; push @$new, clone($_,$_[1]) foreach @{$_[0]}; $class ? bless( $new, $class ) : $new; }, SCALAR => sub { my $class = blessed($_[0]); my $v = ${$_[0]}; $class ? bless \$v, $class : \$v; }, REF => sub { my $class = blessed($_[0]); my $v; my $new = $_[1]->{ refaddr($_[0]) } = \$v; $v = clone ( ${$_[0]},$_[1] ); $class ? bless \$v, $class : \$v; }, REGEXP => sub { $_[0]; } ); sub clone { return unless @_; return $_[0] unless ref $_[0]; return $_[1]->{refaddr($_[0])} || (UNIVERSAL::can($_[0],'_clone') || $handlers{reftype($_[0])} || sub { die "Unknown reftype " . reftype($_[0])} )->(@_); } } 1;