Resulta que simplemente agregando el rol MooseX::Clone
para la clase proporciona un método clone()
que recursivamente clona atributos.
- Para atributos hashref/arrayref, copia estructuras.
- Para los escalares (incluidas las referencias) simplemente hace una copia superficial de la referencia.
- Si agrega
traits => ['Clone']
al atributo, clonará recursivamente el atributo llamando al clone()
en el valor del atributo.
Para apoyar la clonación Set::Object
, terminé creando un rasgo denominado CloneByCoercion
subclasificando el rasgo Clone
, parametrizada con el tipo de coaccionar a/desde antes de la clonación.
Así que para usarlo, escribí:
has 'blah' => (isa => 'Set::Object', is => rw,
traits => ['CloneByCoercion' => {to=>'ArrayRef'}]
);
MooseX::Types::Set::Object
proporciona coacciones hacia y desde arrayref (aunque necesitaba para arreglar un error en ella: la coacción a arrayref debe devolver una referencia, no una lista)
También modifiqué MooseX::Clone
para mantener un hash visto por los objetos, de modo que sea compatible con la clonación de estructuras de objetos interconectados con referencias circulares.
Eventualmente voy a poner todo esto en CPAN o enviar parches a los módulos.
Creo que solo necesita usar el rasgo 'StorableClone' en el atributo Establecer :: Objeto; que debería usar automáticamente 'dclone' en él. (StorableClone es parte de MooseX :: Clone). – cjm