Moose - 为什么在子角色中定义的Accessor不满足父角色要求

时间:2011-11-28 17:04:17

标签: moose

我使用角色定义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

1 个答案:

答案 0 :(得分:0)

所以这里的问题(我认为它被MooseX :: Declare掩盖)是一个已知问题,其中角色组合可能在属性生成方法之前发生。如果更改代码以将角色组合移动到属性声明之后:

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

并且错误消失了。我认为MooseX :: Declare通过将角色组合移动到角色/类声明的末尾来保护您免受此攻击,但在这种情况下似乎不是这种情况。也许使用MooseX :: Declare更多的人可以更好地阐明那里正在发生的事情。