Skip to content
Browse files

BUILDARGS, DEMOLISH

  • Loading branch information...
1 parent 1b97750 commit 224adc674cc133a7303993eade0cedf653c6566d @lestrrat lestrrat committed Oct 26, 2009
Showing with 19 additions and 4 deletions.
  1. +19 −4 Moose/Manual/Construction.pod
View
23 Moose/Manual/Construction.pod
@@ -30,18 +30,19 @@ C<BUILDARGS>は、ハッシュ(リファレンス)以外の呼び出し方
この場合、C<BUILDARGS>メソッドがないと、Mooseは(ハッシュまたはハッシュリファレンスを期待しているので)エラーを発生させますが、C<BUILDARGS>メソッドを使うとこの呼び出し方に対応できます。
- sub BUILDARGS {
+ around BUILDARGS {
+ my $orig = shift;
my $class = shift;
if ( @_ == 1 && ! ref $_[0] ) {
- return { ssn => $_[0] };
+ return $clas->$orig( ssn => $_[0] );
}
else {
- return $class->SUPER::BUILDARGS(@_);
+ return $class->$orig(@_);
}
}
-C<SUPER::BUILDARGS>を呼んでいることに注意してください。これはL<Moose::Object>にデフォルトで用意されているC<BUILDARGS>を呼ぶものです。このメソッドを使うとハッシュリファレンスとただのハッシュを区別してくれます。
+C<$class->$orig>を呼んでいることに注意してください。これは親クラスのメソッドを呼び出すことによりL<Moose::Object>にデフォルトで用意されているC<BUILDARGS>を呼ぶものです。このメソッドを使うとハッシュリファレンスとただのハッシュを区別してくれます。
=head2 BUILD
@@ -64,6 +65,8 @@ C<BUILD>メソッドのほかの使い方としては、オブジェクトを生
debug( 'Made a new person - SSN = ', $self->ssn, );
}
+ここでは使用していませんが、C<BUILD>メソッドは作成されたオブジェクトだけではなく、newに渡された元の引数(もしC<BUILDARGS>をオーバーライドしているなら、C<BUILDARGS>の戻り値)が渡されます。デフォルトで提供されている初期化や型変換の仕組み以外の操作が必要な場合は便利かもしれません。
+
=head3 BUILDと親クラス
継承階層に複数のC<BUILD>メソッドがある場合、Perlのふつうのメソッドとは相互作用の仕方が異なるので、B<決してC<< $self->SUPER::BUILD >>は呼ばないようにしてください。>
@@ -76,8 +79,20 @@ Mooseは、オブジェクトを生成するとき、階層内にあるすべて
Mooseを使うと、オブジェクトを破棄するときもC<DEMOLISH>メソッドで割り込みをかけられます。C<BUILD>の場合と同じく、明示的にC<< $self->SUPER::DEMOLISH >>を呼ぶことは決してしないでください。Mooseは階層内のすべてのC<DEMOLISH>メソッドを、もっとも具体的なクラスからもっとも抽象的なクラスの順に呼ぶよう手配します。
+それぞれのC<DEMOLISH>メソッドは1つの引数をうけとります。
+
ただし、たいていの場合はPerlに組み込まれているガベージコレクションで十分です。C<DEMOLISH>メソッドを用意する必要はありません。
+=head2 オブジェクト破棄時のエラー処理
+
+オブジェクト破棄時の動作とPerlのグローバル変数C<$@>やC<$?>との連携は時々わかりにくい副作用を及ぼします。
+
+オブジェクト破棄時にMooseは必ずC<$?>をローカル化します。これはもしデストラクタでC<system>を使用してても、C<exit>の値は保護されるということになります。
+
+オブジェクト破棄時にMooseは必ずC<$@>もローカル化します。ただし、オブジェクトのC<DEMOLISH>メソッドが例外を投げた場合はMooseは明示的に再度同じ例外を投げます。
+
+もしこの動作仕様があなたの要求と会わない場合は、デフォルトのL<Moose::Object>の代わりに自前のC<DESTROOY>メソッドを用意する必要があります。このようにすると例えばC<$@>の値を保持したままオブジェクト破棄時に起こったエラーのスタックをキャプチャすることができます。
+
=head1 作者
Dave Rolsky E<lt>autarch@urth.orgE<gt>

0 comments on commit 224adc6

Please sign in to comment.
Something went wrong with that request. Please try again.