2009-11-28 14 views
6

Je voudrais simplement déclarer un attribut en lecture seule dans Moose qui ne peut pas être initialisé dans un appel à new. Ainsi, après avoir déclaré ce qui suit:Comment puis-je empêcher que les attributs en lecture seule de Perl Moose soient définis lors d'un appel à new?

package SOD::KuuAnalyze::ProdId; 

use Moose; 

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

1; 

Je ne veux pas ce qui suit au travail:

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

utilisateurs n'a pas défaut, comment fonctionne-t-il jamais se mettre? – Schwern

Répondre

13

Utilisez la configuration d'attribut init_arg (voir "Paramètres du constructeur" dans 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

Cela fonctionne bien, merci. Cependant, il échoue silencieusement. Y at-il un moyen de l'obtenir pour lancer une erreur en essayant ProdId-> new (users => ['one', 'two'])? – ennuikiller

+4

Si vous utilisez MooseX :: StrictConstructor, la construction du module échouera si des arguments non valides ou non autorisés sont transmis au constructeur. Je l'utilise dans presque toutes mes classes Moose (pour le reste, j'utilise MooseX :: SlurpyConstructor qui saisit tous les arguments qui ne sont pas utilisés par les attributs). – Ether

4

Que diriez-vous

package SOD::KuuAnalyze::ProdId; 

use Moose; 

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

Réglage du init_arg à undef semble être nécessaire pour désavouer mise en l'attribut du constructeur.