2009-11-28 10 views
6

Me gustaría simplemente declarar un atributo de solo lectura en Moose que no se puede inicializar en una llamada a nuevo. Así que después de declarar lo siguiente:¿Cómo puedo evitar que los atributos de solo lectura de Perl Moose se establezcan en una llamada a uno nuevo?

package SOD::KuuAnalyze::ProdId; 

use Moose; 

has 'users' => (isa => 'ArrayRef[Str]', is => "ro"); 

1; 

no quiero lo siguiente para trabajar:

my $prodid = SOD::KuuAnalyze::ProdId->new(users => ["one", "two"]); 
+0

usuarios tiene ningún valor predeterminado, ¿cómo es que alguna vez consiga el sistema? – Schwern

Respuesta

13

utilizar la configuración init_arg atributo (ver "parámetros del constructor" en Moose::Manual::Attributes):

package SOD::KuuAnalyze::ProdId; 
use Moose; 

has 'users' => (
    isa => 'ArrayRef[Str]', is => "ro", 
    init_arg => undef, # do not allow in constructor 
); 
1; 
+1

Esto funciona muy bien, gracias. Sin embargo, falla silenciosamente. ¿Hay alguna manera de hacer que arroje un error al intentar ProdId-> new (users => ['one', 'two'])? – ennuikiller

+4

Si usa MooseX :: StrictConstructor, la construcción del módulo fallará si se pasan al constructor argumentos no válidos o rechazados. Lo uso en casi todas mis clases de Moose (por lo demás, utilizo MooseX :: SlurpyConstructor, que capta todos los argumentos que no utilizan los atributos). – Ether

4

¿Qué tal

package SOD::KuuAnalyze::ProdId; 

use Moose; 

has 'users' => (isa => 'ArrayRef[Str]', is => 'ro', init_arg => undef, default => sub { [ 'one', 'two' ] }); 

Ajuste del init_arg a undef parece ser necesario para no permitir el ajuste el atributo del constructor.

Cuestiones relacionadas