Таким образом, проблема здесь (и я думаю, что она маскируется MooseX :: Declare) - это известная проблема, при которой составление ролей может произойти до того, как методы сгенерированы атрибутом. Если вы измените свой код, чтобы переместить состав ролей после объявления атрибута:
role impl {
has myattribute => (is => 'ro', default => 'zz');
with qw(impl);
method mymethod { ...; }
}
и ошибка исчезает. Я думал, что MooseX :: Declare защитит вас от этого, переместив ролевую композицию в конец объявления ролей / классов, но, похоже, в данном случае это не так. Возможно, тот, кто использует MooseX :: Declare more, сможет лучше осветить происходящее там.