ennuikiller
ennuikiller

Reputation: 46965

How can I prevent Perl Moose Read-Only Attributes being set upon a call to new?

I would like to simply declare a read only attribute in Moose that cannot be initialized in a call to new. So after declaring the following:

package SOD::KuuAnalyze::ProdId;

use Moose;

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

1;

I do not want the following to work:

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

Upvotes: 7

Views: 963

Answers (2)

friedo
friedo

Reputation: 66978

How about

package SOD::KuuAnalyze::ProdId;

use Moose;

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

Setting the init_arg to undef seems to be necessary to disallow setting the attribute from the constructor.

Upvotes: 5

Ether
Ether

Reputation: 53976

Use the init_arg attribute configuration (see "Constructor parameters" in 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;

Upvotes: 15

Related Questions