Search code examples
perlattributesnew-operatormoose

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"]);

Solution

  • 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;