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

A cloning policy is a rule that how a cloning routine copies data. Here is the cloning policy of Data::Clone.

Non-reference values

Non-reference values are copied normally, which will drop their magics.

Scalar references

Scalar references including references to other types of references are not copied deeply. They are copied on surface because it is typically used to refer to something unique, namely global variables or magical variables.

Array references

Array references are copied deeply. The cloning policy is applied to each value recursively.

Hash references

Hash references are copied deeply. The cloning policy is applied to each value recursively.

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 resources which Data::Clone could not deal with. 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:

Of course, you can use Clone::clone(), Storable::dclone(), and/or anything you want as an implementation of clone methods.

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 a 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.