我有一个 Moose::Role,其中包含一个网络客户端作为属性:
package Widget;
use Moose::Role;
has 'network_thingy' => (
isa => Maybe[ThingyClient],
);
当然,我有几个使用这个角色的具体 Moose 类:
package BlueWidget;
use Moose;
with 'Widget';
现在涉及到小部件的功能测试。我们有能力创建ThingyServer对象,直接使用 ThingyServer 对象而不是启动守护程序并让 ThingyClient 通过网络连接到它会更快,整体上也很棒。由于 ThingyClient 和 ThingyServer 方便地具有完全相同的方法,这应该很容易实现。但当然,Moose 要求我在测试最终构建 BlueWidget 时使用 ThingyClient。
我做了一些研究,发现了 Moose::Meta 文档。看起来很完美!所以这里是测试代码:
my $metarole = Moose::Meta::Role->initialize('Widget');
// first remove the old attribute
$metarole->remove_attribute('network_thingy');
我打算添加一个新属性,但我想我会先检查角色和类的状态。现在,如果我转储 $metarole,它看起来很棒。不再有 network_thingy 属性。但是,如果我构建一个 BlueWidget 类,或者只是在元类中达到顶峰......
$metaclass = Moose::Meta::Class->initialize('BlueWidget');
diag Dumper ($metaclass);
……果然network_thingy还在。这根本不是我所期望的。如何在运行时修改/删除/替换 Widget 角色的属性?