【发布时间】:2010-10-15 19:51:52
【问题描述】:
我最近将 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?
感谢您对此问题的任何帮助或建议!
【问题讨论】: