我使用角色定义API,并使用角色定义实现。我在创建对象之前将多个实现角色组合到一个类中。我遇到了一个问题,即普通方法无法识别访问器方法。请参阅下面的代码以及运行时收到的错误。我想知道这是一个预期的行为还是一个bug?
代码:
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
答案 0 :(得分:0)
所以这里的问题(我认为它被MooseX :: Declare掩盖)是一个已知问题,其中角色组合可能在属性生成方法之前发生。如果更改代码以将角色组合移动到属性声明之后:
role impl {
has myattribute => (is => 'ro', default => 'zz');
with qw(impl);
method mymethod { ...; }
}
并且错误消失了。我认为MooseX :: Declare通过将角色组合移动到角色/类声明的末尾来保护您免受此攻击,但在这种情况下似乎不是这种情况。也许使用MooseX :: Declare更多的人可以更好地阐明那里正在发生的事情。