BUILD
メソッドが失敗した場合にクラスを爆破させたい。ただし、croak
エラーの処理に使用する場合、エラーはClass/MOP/Method.pm
呼び出し元のコードではなく、から報告されます。(つまり、オブジェクトをインスタンス化する呼び出し元です。)IOWcroak
は、呼び出しツリーを十分に吠えていません。
見よ:
package Test;
use Moose;
use Carp 'croak';
sub BUILD {
croak 'u r dum';
}
1;
Test
結果をインスタンス化すると、次のようになります。
u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Class/MOP/Method.pm line 125
Carp.pm
避けるべきパッケージを知るために呼び出されるパッケージ変数に注意を払うことになって@CARP_NOT
いますが、リストの1つの項目にしか注意を払っていないようです。たとえば、これを自分のTest.pm
:に追加すると
our @CARP_NOT = ( 'Class::MOP::Method' );
その結果は次のとおりです。
u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm line 59
だから私はそれを配列にも追加する必要がありますよね?
our @CARP_NOT = ( 'Class::MOP::Method', 'Moose::Object' );
その後、結果はまだです:
u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm line 59
Moose::Object
影響を受けていないようです。
私はしばらくの間これに頭をぶつけてきました、そしてそれを台無しにしているものを理解することができないようです。
ありがとう。