Недавно я обновил Moose до версии 1.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, и атрибут «источник», упомянутый в сообщении об ошибке, является одним из них.
отчасти причина наличия принуждения в GOBO::Node, по-видимому, заключается в сокращении при создании нового узла. Было бы лучше использовать BUILDARGS, а не принуждать?
где я должен поместить принуждение, если я хочу, чтобы несколько пакетов могли его использовать? Если я добавлю приведение к (например) GOBO::Attributed, я получу предупреждение о том, что оно уже существует. Однако без принуждения я получаю предупреждение выше о невозможности принуждения.
есть отдельный пакет подтипов; было бы лучше создать подтип GOBO::Node, например. GOBO::Node::ProtoNode -- и приведение, и использование этого атрибута должно быть GOBO::Nodes?
Спасибо за любую помощь или совет по этой проблеме!