Черты атрибутов только для чтения и как их устанавливать? - PullRequest
3 голосов
/ 17 июня 2010

Как установить признак атрибута «Только чтение» для 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)

Ответы [ 2 ]

6 голосов
/ 17 июня 2010

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

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

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

0 голосов
/ 18 июня 2010

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

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

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

...