Fine grained cloning support for moose objects.
package Bar; use Moose; with qw(MooseX::Clone); has foo => ( isa => "Foo", traits => [qw(Clone)], # this attribute will be recursively cloned ); package Foo; use Moose; # this API is used/provided by MooseX::Clone sub clone { my ( $self, %params ) = @_; # ... } # used like this: my $bar = Bar->new( foo => Foo->new ); my $copy = $bar->clone( foo => [ qw(Args for Foo::clone) ] );
Out of the box Moose only provides very barebones cloning support in order to maximize flexibility.
This role provides a \*(C`clone\*(C' method that makes use of the low level cloning support already in Moose and adds selective deep cloning based on introspection on top of that. Attributes with the \*(C`Clone\*(C' trait will handle cloning of data within the object, typically delegating to the attribute value's own \*(C`clone\*(C' method.
By default Moose objects are cloned like this: bless { %$old }, ref $old; By specifying the Clone trait for certain attributes custom behavior the value's own \*(C`clone\*(C' method will be invoked. By extending this trait you can create custom cloning for certain attributes. By creating \*(C`clone\*(C' methods for your objects (e.g. by composing MooseX::Compile) you can make them interact with this trait.
Specifies attributes that should be skipped entirely while cloning.
Returns a clone of the object. All attributes which do the MooseX::Clone::Meta::Attribute::Trait::Clone role will handle cloning of that attribute. All other fields are plainly copied over, just like in \*(L"clone_object\*(R" in Class::MOP::Class. Attributes whose \*(C`init_arg\*(C' is in %params and who do the \*(C`Clone\*(C' trait will get that argument passed to the \*(C`clone\*(C' method (dereferenced). If the attribute does not self-clone then the param is used normally by \*(L"clone_object\*(R" in Class::MOP::Class, that is it will simply shadow the previous value, and does not have to be an array or hash reference.
Refactor to work in term of a metaclass trait so that \*(C`meta->clone_object\*(C' will still do the right thing.
clkao made the food required to write this module
<http://code2.0beta.co.uk/moose/svn/>. Ask on #moose for commit bits.
Yuval Kogman <[email protected]>
Copyright (c) 2008 Yuval Kogman. All rights reserved This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.