这是难题。我使用 Moose::Role 作为接口,其中具体类必须实现角色定义的所需属性构建器。该角色还定义了一些对属性执行逻辑的方法。这是我正在尝试做的精简版。
package Parent;
use Moose::Role;
requires '_build_permission_level';
has 'permission_level' => (
is => 'ro',
isa => Int,
lazy_build => 1,
);
use constant {
LEVEL1 = 1,
LEVEL2 = 2,
LEVEL3 = 3,
};
sub can_do_action {
my $self = shift;
return $self->permission_level() >= LEVEL2;
}
package Child;
use Moose;
with 'Parent';
sub _build_permission_level { return Parent->LEVEL3; }
显然我有很多子类,具有不同的权限级别。现在这行得通,但效率极低。所有子实例将始终具有相同的权限级别,但我必须实例化它只是为了询问它是否可以执行操作。当批量运行 10,000 次时,你就明白了。
所以相反,我想让 permission_level 成为一个类属性。以 Moose-y 方式解决效率问题。注意permission_level 不再需要$self。
package Parent;
use Moose::Role;
use MooseX::ClassAttribute;
requires '_build_permission_level';
class_has 'permission_level' => (
is => 'ro',
isa => Int,
builder => '_build_permission_level',
);
use constant {
LEVEL1 = 1,
LEVEL2 = 2,
LEVEL3 = 3,
};
sub can_do_action {
return permission_level() >= LEVEL2;
}
package Child;
use Moose;
with 'Parent';
sub _build_permission_level { return Parent->LEVEL3; }
这会因未定义的子例程错误而死,找不到 Parent::permission_level。所以父母不知道permission_level。真的吗?我很困惑它如何无法访问自己的类属性。我一定错过了一些非常简单的东西。但更根本的是,我应该如何让 Parent 为 Child 提供的类属性提供逻辑?