NAME
Data::Clone - Polymorphic data cloning
VERSION
This document describes Data::Clone version 0.001.
SYNOPSIS
# as a function
use Data::Clone;
my $data = YAML::Load("foo.yml"); # complex data structure
my $cloned = clone($data);
# makes Foo clonable
package Foo;
use Data::Clone;
# ...
# Foo is clonable
my $o = Foo->new();
my $c = clone($o); # $o is deeply copied
# used for custom clone methods
package Bar;
use Data::Clone qw(data_clone);
sub clone {
my($proto) = @_;
my $object = data_clone($proto);
$object->do_something();
return $object;
}
# ...
# Bar is also clonable
$o = Bar->new();
$c = clone($o); # Bar::clone() is called
DESCRIPTION
Data::Clone
does data cloning, i.e. copies things recursively. This is smart so that it works with not only non-blessed references, but also with blessed references (i.e. objects). When clone()
finds an object, it calls a clone
method of the object if the object has a clone
, otherwise it makes a surface copy of the object. That is, this module does polymorphic data cloning.
Cloning policy
Scalar references
Scalar references are not copied deeply. They are copied on surface because it is typically used to refer to something special, namely global variables or magical variables.
Array references
Array references are copied deeply.
Hash references
Hash references are copied deeply.
Glob, IO and Code references
These references are not copied deeply. They are copied on surface.
Blessed references (objects)
Blessed references are not copied deeply by default, because objects might have external resource which Data::Clone
could not know. They will be copied deeply only if Data::Clone knows they are clonable, i.e. they have a clone
method.
If you want to make an object clonable, you can use the clone()
function as a method:
package Your::Class;
use Data::Clone;
# ...
my $c = clone($your_object); # $your_object->clone() will be called
Or you can import data_clone()
function to define your custom clone method:
package Your::Class;
use Data::Clone qw(data_clone);
sub clone {
my($proto) = @_;
my $object = data_clone($proto);
# anything what you want
return $object;
}
Of course, you can use Clone::clone()
, Storable::dclone()
, and/or anything you want.
Comparison to other cloning modules
There are modules which does data cloning.
Storable
is a standard module which can clone data with dclone()
. It has different cloning policy from Data::Clone
. By default it tries to make a deep copy of all the data including blessed references, but you can change its behaviour with specific hook methods.
Clone
is a well-known cloning module, but it does not polymorphic cloning. This makes a deep copy of data regardless of its types. Moreover, there is no way to change its behaviour, so this is useful only for data which link to no external resources.
Data::Clone
makes a deep copy of data only if it knows that the data are clonable. You can change its behaviour simply by defining clone
methods. It also exceeds Storable
and Clone
in performance.
INTERFACE
Exported functions
clone(Scalar)
Returns a copy of Scalar.
Exportable functions
data_clone(Salar)
Returns a copy of Scalar.
The same as clone()
. Provided for custom clone methods.
DEPENDENCIES
Perl 5.8.1 or later, and a C compiler.
BUGS
No bugs have been reported.
Please report any bugs or feature requests to the author.
SEE ALSO
AUTHOR
Goro Fuji (gfx) <gfuji(at)cpan.org>
LICENSE AND COPYRIGHT
Copyright (c) 2010, Goro Fuji (gfx). All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.