sub clone { my ($value) = @_; if (ref $value) { if (blessed $value) { if ($value->can('clone')) { return $value->clone; } else { die "Sorry object is not cloneable"; } } else { if (ref $value eq 'ARRAY') { return [ map { clone( $_ ) } @$value ]; } elsif (ref $value eq 'HASH') { return { map { $_ => clone( $value->{$_} ) } keys %$value }; } else { die "Sorry cant clone that $value"; } } } else { return $value } } #### multi sub clone (Object where { $_->can('clone') } $value) { return $value->clone; } multi sub clone (Scalar $value) { return $value; } multi sub clone (ArrayRef $value) { return map { clone($_) } @$value; } multi sub clone (HashRef $value) { return map { $_ => clone( $value->{$_} ) } keys %$value; }