---
name: "MooseX::Clone"
section: "3pm"
platform: "linux"
package: "libmoosex-clone-perl"
version: "0.06-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/MooseX::Clone"
---

# MooseX::Clone(3pm)

Fine-grained cloning support for Moose objects.

## NAME

MooseX::Clone - Fine-grained cloning support for Moose objects.

## VERSION

version 0.06

## 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 `"clone"` 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 `"Clone"` trait will handle cloning of data within the object, typically delegating to the attribute value's own `"clone"` 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 `"clone"` method will be invoked.

  By extending this trait you can create custom cloning for certain attributes.

  By creating `"clone"` 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

- clone %params

  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 "clone\_object" in Class::MOP::Class.

  Attributes whose `"init_arg"` is in `%params` and who do the `"Clone"` trait will get that argument passed to the `"clone"` method (dereferenced). If the attribute does not self-clone then the param is used normally by "clone\_object" 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 `"meta->clone_object"` will still do the right thing.

## THANKS

clkao made the food required to write this module

## AUTHOR

XXXX XXX'XX (Yuval Kogman) \<nothingmuch@woobling.org\>

## COPYRIGHT AND LICENSE

This software is copyright (c) 2008 by XXXX XXX'XX (Yuval Kogman).

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
