2010-06-17 2 views
3

Как установить атрибут атрибута только для чтения Moose?Лошь только атрибуты атрибута только для чтения и как их установить?

package AttrTrait; 
use Moose::Role; 
has 'ext' => (isa => 'Str', is => 'ro'); 

package Class; 
has 'foo' => (isa => 'Str', is => 'ro', traits => [qw/AttrTrait/]); 

package main; 
my $c = Class->new(foo => 'ok'); 
$c->meta->get_attribute('foo')->ext('die') # ro attr trait 

Что цель только для чтения атрибутов качества, если вы не можете установить его в конструкторе или во время выполнения? Что-то мне не хватает в Moose::Meta::Attribute? Есть ли способ установить его с помощью meta?

$c->meta->get_attr('ext')->set_value('foo') # doesn't work either (attribute trait provided not class provided method) 

ответ

6

Вы можете установить его в конструкторе:

package Class; 
has 'foo' => (isa => 'Str', is => 'ro', ext => 'whatever', traits => ['AttrTrait']); 

Вам просто нужно передать его в правый конструктор (конструктор атрибута).

-1

Я использую default, чтобы иметь дело с ro атрибутами:

package Foo; 
use Moose; 
has 'myattr' => (is => 'ro', default => 'my value goes here'); 

И так как вы не будете устанавливать значение myattr «s где-нибудь еще, используется по умолчанию.