| Phaylon-Class-Cloner documentation | Contained in the Phaylon-Class-Cloner distribution. |
Phaylon::Class::Cloner - Experimental Customizable Cloning Device
use Phaylon::Class::Cloner;
# that's what I needed
my $cloner = Phaylon::Class::Cloner->new ({
CODE => sub {
my ( $self, $coderef ) = @_;
return $coderef;
},
});
# cloning something
my $cloned = $cloner->clone( $structure );
I had problems with cloning of structures that contain coderefs. I didn't need to clone coderefs, just array and hash references. This module enables one to define custom specific and default cloning functionalities.
Creates a new cloning object. Here's a quick example to show what can be passed:
my $cloner = Phaylon::Class::Cloner->new ({
# if the module finds a coderef
CODE => sub { ... },
# module ran into an object
MyClass => sub {
my ( $self, $object ) = @_;
return $object->some_cloning_mechanism;
},
# what to do for non-refs. default is just to
# return the value
'' => sub { ... },
# if nothing's found for this type. preset to use
# Storage::dclone()
':default' => sub { ... },
});
Dispatcher for cloning functionality.
Preset default cloning. Uses Storage's dclone
Cloning for non-reference scalars. Defaults to return the value.
Default for hash references. Clones first level with redispatching
values to clone.
Same as _clone_HASH just for arrays.
Carp, Storable
Due to the specific and experimental nature of this module, it's trying not to waste
namespaces and therefore lies under Phaylon::.
This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
Copyright (c) 2005: Robert Sedlacek phaylon@dunkelheit.at
| Phaylon-Class-Cloner documentation | Contained in the Phaylon-Class-Cloner distribution. |
package Phaylon::Class::Cloner; use warnings; use strict; use Carp; use Storable qw/ dclone /; use vars qw/ $VERSION /; $VERSION = 0.01;
sub new { my ( $class, $options ) = @_; croak 'First argument should be option hash reference' unless ref $options eq 'HASH'; $options->{HASH} ||= \&_clone_HASH; $options->{ARRAY} ||= \&_clone_ARRAY; $options->{ '' } ||= \&_clone_plain_scalar; $options->{ ':default' } ||= \&_clone_default; my $self = bless $options, $class; return $self; }
sub clone { my ( $self, $struct ) = @_; my $key = ( ref $struct || '' ); my $code = $self->{ $key } || $self->{ ':default' }; croak "No coderef behind $key" unless ref $code eq 'CODE'; return $self->$code( $struct ); }
sub _clone_default { my ( $self, $struct ) = @_; return dclone( $struct ); }
sub _clone_plain_scalar { my ( $self, $struct ) = @_; return $struct; }
sub _clone_HASH { my ( $self, $struct ) = @_; return { map { ( $_ => $self->clone( $struct->{ $_ } ) ) } keys %$struct }; }
sub _clone_ARRAY { my ( $self, $struct ) = @_; return [ map { $self->clone( $_ ) } @$struct ]; }
1;