Entiendo que el uso de builder
habilita subclases para anular los valores predeterminados de atributo fácilmente y los roles pueden require
ellos. Esto también se puede lograr usando default
así:Moose "generador" vs "predeterminado"
has 'foo' =>
is => 'rw',
isa => 'Str',
default => sub { $_[0]->_build_foo };
Me pregunto si hay más ventajas de utilizar builder
No estoy al tanto? Yo he llegado con un poco de mí mismo:
builder
es declarativa para que pueda introspección quefoo
es construida por_build_foo
builder
elimina un envoltorio subrutina lo que es un poco más rápidobuilder
permite el uso de la útillazy_build
.
ACTUALIZACIÓN Para aclarar, no se trata de default
vs builder
en general, pero default => sub { $_[0]->_build_foo }
vs builder => '_build_foo'
.
¿Por qué crees que 'default => \ & builder' no hace cada una de esas cosas? – ikegami
@ikegami porque '\ & builder' se resolverá en' & builder' en el paquete actual. Una subclase que proporciona un nuevo 'constructor' tendría que hacer' has '+ attr' => builder => \ & builder' de nuevo para vincularlo al método reemplazado. OTOH 'builder => 'builder'' se resuelve en tiempo de ejecución. – hobbs
Como contrapunto, una subclase puede anular el atributo y cambiar el 'predeterminado'. Esto no requiere conocer el nombre del método 'constructor' probablemente privado. * Ambos * requieren saber si el atributo está usando 'default' o' builder' porque no puedes tener ambos. En general, esta información es privada y está sujeta a cambios. Anular el comportamiento predeterminado de los atributos en Moose es problemático, debe publicar detalles sobre cómo se implementa ese comportamiento predeterminado o si la subclase debe introspectarse. :/ – Schwern