SYNOPSIS

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

DESCRIPTION

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.

TRAITS

Clone

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.

NoClone

Specifies attributes that should be skipped entirely while cloning.

METHODS

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.

TODO

Refactor to work in term of a metaclass trait so that \*(C`meta->clone_object\*(C' will still do the right thing.

THANKS

clkao made the food required to write this module

VERSION CONTROL

<http://code2.0beta.co.uk/moose/svn/>. Ask on #moose for commit bits.

AUTHOR

Yuval Kogman <[email protected]>

COPYRIGHT

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.