Phaylon::Class::Cloner - Experimental Customizable Cloning Device


Phaylon-Class-Cloner documentation Contained in the Phaylon-Class-Cloner distribution.

Index


Code Index:

NAME

Top

Phaylon::Class::Cloner - Experimental Customizable Cloning Device

SYNOPSIS

Top

  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 );

DESCRIPTION

Top

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.

PUBLIC METHODS

Top

new( options hashref )

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 { ... },
  });

clone( data )

Dispatcher for cloning functionality.

INTERNAL METHODS

Top

_clone_default

Preset default cloning. Uses Storage's dclone

_clone_plain_scalar

Cloning for non-reference scalars. Defaults to return the value.

_clone_HASH

Default for hash references. Clones first level with redispatching values to clone.

_clone_ARRAY

Same as _clone_HASH just for arrays.

REQUIRES

Top

Carp, Storable

SEE ALSO

Top

Storable

NAMESPACE

Top

Due to the specific and experimental nature of this module, it's trying not to waste namespaces and therefore lies under Phaylon::.

LICENSE

Top

This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.

AUTHOR AND COPYRIGHT

Top


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;