package Data::Clone; use 5.008_001; use strict; our $VERSION = '0.003'; use XSLoader; XSLoader::load(__PACKAGE__, $VERSION); use parent qw(Exporter); our @EXPORT = qw(clone); our @EXPORT_OK = qw(data_clone TIECLONE); sub data_clone; *data_clone = \&clone; # alias sub TIECLONE; *TIECLONE = \&clone; # alias 1; __END__ =head1 NAME Data::Clone - Polymorphic data cloning =head1 VERSION This document describes Data::Clone version 0.003. =head1 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 =head1 DESCRIPTION C 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 C finds an object, it calls a C method of the object if the object has a C, otherwise it makes a surface copy of the object. That is, this module does polymorphic data cloning. Although there are several modules on CPAN which can clone data, this module has a different cloning policy from almost all of them. See L and L for details. =head2 Cloning policy A cloning policy is a rule that how a cloning routine copies data. Here is the cloning policy of C. =head3 Non-reference values Non-reference values are copied normally, which will drop their magics. =head3 Scalar references Scalar references including references to other types of references are B copied deeply. They are copied on surface because it is typically used to refer to something unique, namely global variables or magical variables. =head3 Array references Array references are copied deeply. The cloning policy is applied to each value recursively. =head3 Hash references Hash references are copied deeply. The cloning policy is applied to each value recursively. =head3 Glob, IO and Code references These references are B copied deeply. They are copied on surface. =head3 Blessed references (objects) Blessed references are B copied deeply by default, because objects might have external resources which C could not deal with. They will be copied deeply only if C knows they are clonable, i.e. they have a C method. If you want to make an object clonable, you can use the C function as a method: package Your::Class; use Data::Clone; # ... my $your_class = Your::Class->new(); my $c = clone($your_object); # $your_object->clone() will be called Or you can import C 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 C, C, and/or anything you want as an implementation of C methods. =head2 Comparison to other cloning modules There are modules which does data cloning. C is a standard module which can clone data with C. It has a different cloning policy from C. 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. C 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. C makes a deep copy of data only if it knows that the data are clonable. You can change its behaviour simply by defining C methods. It also exceeds C and C in performance. =head1 INTERFACE =head2 Exported functions =head3 B<< clone(Scalar) >> Returns a copy of I. =head2 Exportable functions =head3 B<< data_clone(Salar) >> Returns a copy of I. The same as C. Provided for custom clone methods. =head3 B<< is_cloning() >> Returns true inside the C function, false otherwise. =head1 DEPENDENCIES Perl 5.8.1 or later, and a C compiler. =head1 BUGS No bugs have been reported. Please report any bugs or feature requests to the author. =head1 SEE ALSO L L =head1 AUTHOR Goro Fuji (gfx) Egfuji(at)cpan.orgE =head1 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. =cut