3

ArrayRef[HashRef]タイプからに強制しようとしてArrayRef[MyModule::Object]いますが、何らかの理由でエラーが発生しています。以下は私の型制約クラスです:

package MyModule::Types;
use Mouse::Util::TypeConstraints;

subtype 'CoercedArrayRefOfMyModuleObjects' => as 'ArrayRef[MyModule::Object]';
coerce 'CoercedArrayRefOfMyModuleObjects'
    => from 'ArrayRef[HashRef]'
    => via { [map { MyModule::Object->new( %{$_} ) } @{$_}] };

no Mouse::Util::TypeConstraints;
1;

これは、MyModule::Objects の配列参照を持つクラスです。

use strict;
package MyModule;
use Mouse;
use MyModule::Types;

has objects => ( 
    is => 'rw',
    isa => 'CoercedArrayRefOfMyModuleObjects',
    coerce => 1,
);

__PACKAGE__->meta->make_immutable();

1;

そして、これは私のMyModule::Objectクラスです:

use strict;
package MyModule::Object;
use Mouse;

has x => (
    is => 'rw',
    isa => 'Int',
);

__PACKAGE__->meta->make_immutable();

1;

しかし、オブジェクトを作成してそれにハッシュの配列参照を渡そうとするたびに:

my $obj = MyModule->new(objects => [{x => 1}, {x => 2}, {x => 3}]);

次のエラーが表示されます。

The type constraint 'CoercedArrayRefOfMyModuleObjects' has already been created in Mouse::Util::TypeConstraints and cannot be created again in MyModule::Types ('CoercedArrayRefOfMyModuleObjects' is an implicitly created type constraint) at lib/MyModule/Types.pm line 41.

これがなぜなのか誰か知っていますか?

編集:use MyModule::Typesおそらく複数の場所にいる私と関係があると思います。ただし、モジュールを単独で使用できるように、複数の場所で使用する必要があります。また、何らかの理由で、他のタイプ (TypeConstraints ファイルで他のタイプが定義されています) では、このエラーが発生していないようです。Mouse::Util::TypeConstraints は、モジュールを個別に使用できるように、一緒に使用される可能性のあるモジュールに含まれていることを処理できるべきではありませんか?

4

0 に答える 0