【发布时间】:2018-02-10 11:17:09
【问题描述】:
基本架构
我在perl中构建了一个信息检索工具,使用Moose作为框架。
我有一个插件类层次结构,其中Base 作为插件的公共基类,特定于访问方法的插件从该类继承(方法是 HTTP、FTP、IMAP...)。
从这些子类中,实际的工作类继承(每个数据源一个插件)。
我使用 Moose 角色将特定于源的行为组合到实际的工作类中(例如在 HTTP 源中启用对 SSL 客户端证书的支持)。
问题
其中一个方法特定类 (Base::A) 需要角色 R。相同的角色R 也被角色S 使用,然后被工作类X 使用,继承自Base::A。
我的问题是R 中的方法修饰符被两次应用于X。有没有办法阻止 Moose 将方法修饰符应用于已应用于某个父类的类?
示例
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use v5.14;
{
package R;
use Moose::Role;
before 'bar' => sub { say "R::before'bar'()" }
}
{
package S;
use Moose::Role;
with 'R';
before 'bar' => sub { say "S::before'bar'()" }
}
{
package Base;
use Moose;
sub foo { say "Hello foo()"; }
}
{
package Base::A;
use Moose;
extends 'Base';
with 'R';
sub bar { $_[0]->foo(); say "Hello bar()"; }
}
{
package X;
use Moose;
extends 'Base::A';
with 'S';
}
package main;
my $a = X->new();
$a->bar();
实际输出
S::before'bar'()
R::before'bar'()
R::before'bar'()
Hello bar()
预期输出
R::before'bar'() 行应该只出现一次。
【问题讨论】: