У меня есть роль и несколько классов, которые смешивают роль. Класс Role загружает все реализующие классы, так что все, что импортирует Blah, может использовать их, не набирая много строк 'use'.
package Blah;
use Moose::Role;
use Blah::A;
use Blah::B;
(etc...)
requires '...';
requires 'foo';
around 'foo' => sub { ... }
Типичный подкласс Бла:
package Blah::A;
use Moose;
with 'Blah';
sub foo { ... }
__PACKAGE__->meta->make_immutable;
Поскольку каждый метод подкласса 'foo' начинается с одних и тех же битов кода, роль также реализует их через модификатор метода.
Проблема в том, что Moose не применяет модификатор метода ни к одному из классов Blah :: *. Это происходит, даже если я удаляю вызов make_immutable для классов. Я думал, что ролевое приложение было сделано полностью во время выполнения, и поэтому, хотя классы Blah :: * загружаются до Blah, модификатор все еще должен применяться?
Я ищу исправление или альтернативный способ ведения дел. На данный момент Blah по сути является абстрактным базовым классом, за исключением модификатора метода, именно поэтому я начал использовать роли - но, может быть, иерархия классов будет лучше? Заранее спасибо.