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