我最近将 Moose 升级到 v1.15,发现我使用的一组模块不再起作用。我得到的错误是:
You cannot coerce an attribute (source) unless its type (GOBO::Node) has a coercion at
/opt/local/lib/perl5/site_perl/5.12.0/darwin-multi-2level/Moose/Meta/Role/Application/ToClass.pm line 142
我可以看到几个可能的错误来源,并感谢有关如何解决问题的建议。
GOBO::Node 的第一段代码如下所示:
package GOBO::Node;
[...]
extends 'GOBO::Base';
with 'GOBO::Labeled';
with 'GOBO::Attributed';
coerce 'GOBO::Node'
=> from 'Str'
=> via { new GOBO::Node(id=>$_) };
has 'source' => (is => 'rw', isa => 'GOBO::Node');
该包使用的角色也具有 GOBO::Nodes 属性,错误消息中提到的属性 'source' 就是其中之一。
在 GOBO::Node 中进行强制的部分原因似乎是创建新节点时的捷径。使用 BUILDARGS 而不是强制使用会更好吗?
如果我想要几个包能够使用它,我应该把强制放在哪里?如果我将强制添加到(例如)GOBO::Attributed,我会收到它已经存在的警告。但是,如果没有强制,我会收到上面关于无法强制的警告。
有一个单独的子类型包;创建 GOBO::Node 的子类型会更好吗?例如 GOBO::Node::ProtoNode 和强制转换,并将其用于属性应该是 GOBO::Nodes?
感谢您对此问题的任何帮助或建议!