恥ずかしいほどの時間をデバッグした後、私はついに、this issueを単純なテストケースに切り捨てました。私は、なぜそれが失敗しているのかを理解する助けを謙虚に要請するでしょう。 :)ここで私が得ているエラーメッセージです:MooseX :: Types宣言の問題、厳しいテストケース:)
plxc16479> $h2/tmp/tmp18.pl
This method [new] requires a single argument. at /nfs/pdx/disks/nehalem.pde.077/perl/5.12.2/lib64/site_perl/MooseX/Types/TypeDecorator.pm line 91
MooseX::Types::TypeDecorator::new('MooseX::Types::TypeDecorator=HASH(0x655b90)') called at /nfs/pdx/disks/nehalem.pde.077/projects/lib/Program-Plist-Pl/lib/Program/Plist/Pl.pm line 10
Program::Plist::Pl::BUILD('Program::Plist::Pl=HASH(0x63d478)', 'HASH(0x63d220)') called at generated method (unknown origin) line 29
Program::Plist::Pl::new('Program::Plist::Pl') called at /nfs/pdx/disks/nehalem.pde.077/tmp/tmp18.pl line 10
ラッパーのテストスクリプト:
use strict;
use warnings;
BEGIN {push(@INC, split(':', $ENV{PERL_TEST_LIBS}))};
use Program::Plist::Pl;
my $obj = Program::Plist::Pl->new();
プログラム:: PLIST :: P1のファイル:
package Program::Plist::Pl;
use Moose;
use namespace::autoclean;
use Program::Types qw(Pattern); # <-- Removing this fixes error
use Program::Plist::Pl::Pattern;
sub BUILD {
my $pattern_obj = Program::Plist::Pl::Pattern->new();
}
__PACKAGE__->meta->make_immutable;
1;
プログラム::タイプファイル:
package Program::Types;
use MooseX::Types -declare => [qw(Pattern)];
class_type Pattern, {class => 'Program::Plist::Pl::Pattern'};
1;
さらに、プログラム:: Plist :: Pl :: Patte RNファイル:
package Program::Plist::Pl::Pattern;
use Moose;
use namespace::autoclean;
__PACKAGE__->meta->make_immutable;
1;
注:私は上記のコードでProgram::Types
からPattern
タイプを必要としませんが、私は取り除かれ、他のコードで行います。私がINC
パスを引っ張っているPERL_TEST_LIBS
のenv varには、プロジェクトモジュールへのパスしか含まれていません。これらのパスからロードされる他のモジュールはありません。
Pattern
のMooseX::Typesの定義は問題を引き起こしているようですが、その理由はわかりません。ドキュメントは私が使用している構文を示していますが、それについてはあまり言及されていないので、私はclass_type
を誤用している可能性があります。意図はMooseX::Params::ValidateによってPattern
をタイプチェックに使用して、引数がProgram::Plist::Pl::Program
オブジェクトであることを確認することです。
私はProgram::Types
Pattern
タイプがインポートされた場合でも、直接、エラーなしでtmp18.pl
ラッパー結果からPattern->new
を呼び出すことにより、式から介在クラスProgram::Plist::Pl
を削除することを発見しました。
Program :: Plist :: Pl :: Pattern-> newはPattern-> newと誤解されているようですが、PatternはMy MoXX定義の型です。したがって、Program :: Plist :: Pl :: Patternのインスタンスを作成する代わりに、Pattern型オブジェクトのインスタンスを作成しようとしています。 –