私は最近、Mooseとその優れたOOフレームワークを使い始めたばかりでなく、新しいOOの概念を学ぶこともできました。私がやりたかったことの1つは、オブジェクトの作成中に呼び出し元の観点からエラー報告を行うことでした。Mooseには、croak呼び出しによるデフォルトのエラー報告をオーバーライドするようにMooseに指示するモジュールMoose :: Error::Croakがあることがわかりました。私はそれを使用しましたが、それは役に立たなかったようです
ムースコード-Foo.pm
package Foo;
use metaclass (
metaclass => 'Moose::Meta::Class',
error_class => 'Moose::Error::Croak',
);
use Moose;
has 'attr1' => (
is => 'rw',
isa => 'Str',
required => '1',
);
no Moose;
1;
ムースコード-fooser.pl
#!/usr/bin/perl
use strict;
use warnings;
use Foo;
my $foobj = Foo->new();
これはエラーで失敗します:属性(attr1)は/usr/local/lib/perl/5.8.8/Class/MOP/Class.pm行364に必要です
Moose :: Error :: Croakが使用されていない場合、これは実際のスタックトレースよりも簡潔です。ただし、発信者の観点からは報告しません。これがPerl5OOコードであり、Foo.pmが次のようになっている場合:
package Foo;
use strict;
use warnings;
use Carp;
sub new {
my ($class, %args) = @_;
my $self = {};
if (! exists $args{'attr1'}) {
croak "ERR: did not provide attr1";
}
$self->{'attr1'} = $args{attr1};
bless $self, $class;
return $self;
}
1;
そして、fooser.plが実行された場合、エラーが発生します。
「ERR:fooser.plの6行目にattr1を提供しませんでした」
これは、発信者の観点から、行番号を指しているためです。MOP.pmの行番号ではなくfooser.plの6。364。
Mooseでこれを行うにはどうすればよいですか?それとも私はここで何かを誤解していますか?