Moose - Почему Accessor, определенный в под роли, не удовлетворяет родительской роли - PullRequest
1 голос
/ 28 ноября 2011

Я определяю API с использованием ролей, а также определяю реализацию с использованием ролей.Я объединяю несколько ролей реализации в класс непосредственно перед созданием объектов.Я сталкиваюсь с проблемой, когда методы доступа не распознаются, в то время как обычные методы.Пожалуйста, смотрите код ниже и ошибки, полученные при его запуске.Интересно, это предполагаемое поведение или ошибка?

Код:

use MooseX::Declare;

role api { requires qw(mymethod myattribute); }

role impl with api {
  has myattribute => (is => 'ro', default => 'zz');
  method mymethod { ...; }
}

class cl with impl {}
my $obj = cl->new;

Ошибка:

'impl' requires the method 'myattribute' to be implemented by 'cl' at D:/lab/sbp
/perl/site/lib/Moose/Meta/Role/Application/ToClass.pm line 127

1 Ответ

0 голосов
/ 09 января 2012

Таким образом, проблема здесь (и я думаю, что она маскируется MooseX :: Declare) - это известная проблема, при которой составление ролей может произойти до того, как методы сгенерированы атрибутом. Если вы измените свой код, чтобы переместить состав ролей после объявления атрибута:

role impl {
    has myattribute => (is => 'ro', default => 'zz');
    with qw(impl);
    method mymethod { ...; }
}

и ошибка исчезает. Я думал, что MooseX :: Declare защитит вас от этого, переместив ролевую композицию в конец объявления ролей / классов, но, похоже, в данном случае это не так. Возможно, тот, кто использует MooseX :: Declare more, сможет лучше осветить происходящее там.

...