NAME

MooseX::Extended::Manual::Cloning - An overview of MooseX::Extended optional attribute cloning

VERSION

version 0.05

CLONING SUPPORT

MooseX::Extended offers optional, EXPERIMENTAL support for attribute cloning, but differently from how we see it typically done. You can just pass the clone => 1 argument to your attribute and it will be clone with Storable's dclone function every time you read or write that attribute, it will be cloned if it's a reference, ensuring that your object is effectively immutable.

If you prefer, you can also pass a code reference or the name of a method you will use to clone the object. Each will receive three arguments: $self, $attribute_name, $value_to_clone. Here's a full example, taken from our test suite.

package My::Class {
    use MooseX::Extended;
    use MooseX::Extended::Types qw(NonEmptyStr HashRef InstanceOf);

    param name => ( isa => NonEmptyStr );

    param payload => (
        isa    => HashRef,
        clone  => 1,  # uses Storable::dclone
        writer => 1,
    );

    param start_date => (
        isa   => InstanceOf ['DateTime'],
        clone => sub ( $self, $name, $value ) {
            return $value->clone;
        },
    );

    param end_date => (
        isa    => InstanceOf ['DateTime'],
        clone  => '_clone_end_date',
    );

    sub _clone_end_date ( $self, $name, $value ) {
        return $value->clone;
    }

    sub BUILD ( $self, @ ) {
        if ( $self->end_date < $self->start_date ) {
            croak("End date must not be before start date");
        }
    }
}

Warning: setting the value via the constructor for the first time doesn't clone the data. All other gets and sets will clone it. We need to figure out a clean, performant solution for this.

AUTHOR

Curtis "Ovid" Poe <curtis.poe@gmail.com>

COPYRIGHT AND LICENSE

This software is Copyright (c) 2022 by Curtis "Ovid" Poe.

This is free software, licensed under:

The Artistic License 2.0 (GPL Compatible)