Изменить: ответ добавлен ниже, вопрос оставлен здесь только для исторических целей.
В документации Moose указано, что:
При желании вы также можете явно указать имена методов, которые будут использоваться для чтения и записи значения атрибута. Это особенно удобно, когда вы хотите, чтобы атрибут был общедоступным для чтения, но только для частной установки. Например:
has 'weight' => ( is => 'ro', writer => '_set_weight', );
Это может быть полезно, если вес рассчитывается на основе других методов. Например, каждый раз, когда вызывается метод eat, мы можем корректировать вес. Это позволяет нам скрыть детали реализации изменений веса, но по-прежнему предоставлять значение веса пользователям класса.
На основе этого примера я написал следующий код:
has '_current_url' => (
is => 'ro',
isa => 'URI',
writer => '_write_URI_to_current_url',
);
# Thus we ensure only a URI object gets written to current_url always
sub _current_url
{
my $self = shift;
$self->_write_URI_to_current_url(URI->new_abs($_[0], $self->start_url));
}
Мое намерение состояло в том, чтобы гарантировать, что установка current_url всегда устанавливает объект URI, даже если он вызывается с простой строкой. Однако, когда я пытаюсь запустить код, я получаю:
Невозможно присвоить значение доступному только для чтения методу доступа _current_url
в том месте (в моем классе), где я пытаюсь установить current_url (с $self->_current_url($str);
).
Это мой второй день с Мусом, поэтому я совершенно не понимаю, что здесь происходит. Насколько я понимаю, is => 'ro'
только просит Moose не создавать средство доступа записи по умолчанию с тем же именем, что и у атрибута, правильно ли это понимание? Как я могу достичь своей цели здесь?
via
зависит от второго параметра$self->start_url
, который Moose не понравился, поэтому это привело к ошибке. Получает ли подпрограмма вvia
копию $self, и можно ли использовать другой атрибут для принуждения? - person sundar - Remember Monica   schedule 31.08.2013