2009-11-28 2 views
6

Я хотел бы просто объявить только атрибут read only в Moose, который не может быть инициализирован при вызове new. Поэтому после объявления следующее:Как я могу запретить атрибуты Perl Moose для чтения только при вызове нового?

package SOD::KuuAnalyze::ProdId; 

use Moose; 

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

1; 

Я не хочу, чтобы следующие работы:

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

пользователи не по умолчанию, как это когда-нибудь установить? – Schwern

ответ

13

Используйте конфигурацию init_arg атрибута (смотрите «Параметры Конструктор» в 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

Это хорошо работает, спасибо. Однако он терпит неудачу. Есть ли способ заставить его выбросить ошибку при попытке ProdId-> new (users => ['one', 'two'])? – ennuikiller

+4

Если вы используете MooseX :: StrictConstructor, конструкция модуля завершится неудачно, если какой-либо недопустимый или запрещенный аргумент передается конструктору. Я использую его почти во всех моих классах Moose (для остальных я использую MooseX :: SlurpyConstructor, который захватывает все аргументы, которые не используются атрибутами). – Ether

4

Как насчет

package SOD::KuuAnalyze::ProdId; 

use Moose; 

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

Установка init_arg в undef, как представляется, необходимо запретить установку атрибут от конструктора.

Смежные вопросы