Naofumi Tsujii
tsun****@users*****
2006年 9月 21日 (木) 01:34:27 JST
Index: docs/modules/Object-InsideOut-1.52/InsideOut.pod diff -u docs/modules/Object-InsideOut-1.52/InsideOut.pod:1.1 docs/modules/Object-InsideOut-1.52/InsideOut.pod:1.2 --- docs/modules/Object-InsideOut-1.52/InsideOut.pod:1.1 Tue Sep 19 01:27:00 2006 +++ docs/modules/Object-InsideOut-1.52/InsideOut.pod Thu Sep 21 01:34:27 2006 @@ -285,10 +285,11 @@ 'Parent::Class' => { 'data' => 'info' }, ); -上記の例では、両方のクラスの初期化メソッドが S<C<'foo' =E<gt> 'bar'>> -を受け取ります。C<My::Class>の初期化メソッドは S<C<'param' =E<gt> 'value'>> -も受け取り、C<Parent::Class>の初期化メソッドは S<C<'data' =E<gt> 'info'>> -も受け取ります。この仕掛けでは、特定のクラスに対するパラメータは、 +上記の例では、両方のクラスの初期化メソッドが + S<C<'foo' =E<gt> 'bar'>> を受け取ります。 +C<My::Class>の初期化メソッドは S<C<'param' =E<gt> 'value'>> も受け取り、 +C<Parent::Class>の初期化メソッドは S<C<'data' =E<gt> 'info'>> も受け取ります。 +この仕掛けでは、特定のクラスに対するパラメータは、 それよりも高いレベルで指定された一般的なパラメータをオーバーライドします: my $obj = My::Class->new( @@ -497,7 +498,7 @@ =item その他のリファレンス型 -パラメータの型は、指定した (L<ref()|perlfunc/"ref EXPR">関数が返す) +パラメータの型は、指定した (L<ref()|perlfunc/"ref EXPR">関数が返す) リファレンス型でなければなりません。例えばC<CODE>と指定します。 =back @@ -681,11 +682,12 @@ (つまり、子クラスが最初に) 呼び出されます。 このサブルーチンには2つの引数が渡されます: 新しく生成された - (初期化されていない) オブジェクト (つまりC<$self>) と、 + (初期化されていない)オブジェクト (つまりC<$self>) と、 C<-E<gt>new()>メソッド呼び出し時に与えられた全引数および 他のC<:PreInit>サブルーチンで追加された引数を含むハッシュリファレンスです。 ハッシュリファレンスはC<-E<gt>new()>に与えられたものと必ずしも同じとは限らず、 -1つのハッシュリファレンスにI<平坦化>されるでしょう。例を示します: +1つのハッシュリファレンスにI<平坦化>されるでしょう。 +例を示します: my $obj = My::Class->new( 'param_X' => 'value_X', @@ -725,8 +727,8 @@ メソッドをエクスポートします。 L<threads::shared>を使ったアプリケーションでクラスが使用される可能性が ある場合、クラスコード内でオブジェクトのフィールド配列/ハッシュにデータを -設定する際は、 (あなたのクラスコードをスレッドセーフにするために) -このメソッドを使用してください。 +設定する際は、 (あなたのクラスコードをスレッドセーフにするために) + このメソッドを使用してください。 前述のように、オブジェクトIDを使ってオブジェクトのフィールド配列 (ハッシュ) へ 直接データを設定できます: @@ -737,8 +739,8 @@ しかし、スレッド間でデータ共有する (つまり、C<threads::shared>を使う) アプリケーションでは、C<$data>をフィールド配列 (ハッシュ) に格納できるように -するため、共有データに変換する必要があります。C<-E<gt>set()>メソッドは -あなたに代わってこれらの作業を行います。 +するため、共有データに変換する必要があります。 +C<-E<gt>set()>メソッドはあなたに代わってこれらの作業を行います。 C<-E<gt>set()>メソッドには2つの引数を与えてください: オブジェクトフィールド 配列/ハッシュへのリファレンスと、それに格納するデータ (スカラー) です: @@ -748,9 +750,9 @@ $self->set(\%field, $data); 整理すると、C<-E<gt>set()>メソッドはクラスコード内のみで利用可能であり、 -アプリケーションコードでは使えません。オブジェクトメソッド内で、 -オブジェクトフィールド配列/ハッシュにデータを設定する際に、 -このメソッドを使ってください。 +アプリケーションコードでは使えません。 +オブジェクトメソッド内で、オブジェクトフィールド配列/ハッシュに +データを設定する際に、このメソッドを使ってください。 メソッド名が衝突する場合は、完全修飾名を使ってC<-E<gt>set()>を呼び出せます: @@ -982,12 +984,12 @@ =item :lvalueアクセサ L<perlsub/"Lvalue subroutines">に記されているとおり、C<:lvalue>サブルーチンは -変更可能な値を返します。この変更可能な値は例えば、 -代入文や置換演算子の左辺として使うことができます +変更可能な値を返します。 +この変更可能な値は例えば、代入文や置換演算子の左辺として使うことができます (これ故C<LVALUE> (左辺値) と呼ばれます)。 -Perl 5.8.0以降では、Object::InsideOutはC<LVALUE>コンテキストで使われた場合に -オブジェクトのフィールドに値を設定する、 +Perl 5.8.0以降では、Object::InsideOutはC<LVALUE>コンテキストで +使われた場合にオブジェクトのフィールドに値を設定する、 C<:lvalue>アクセサの生成をサポートしています。 package Contact; { @@ -1112,7 +1114,8 @@ オブジェクトの複製は、オブジェクトに対してC<-E<gt>clone()>メソッドが呼ばれた 時に明示的に起こります。そして、スレッドアプリケーションで新しいスレッドが -作成された時、暗黙のうちに複製が起こります。ほとんど全てのケースについて、 +作成された時、暗黙のうちに複製が起こります。 +ほとんど全てのケースについて、 Object::InsideOutは全ての細かい作業を行うでしょう。 極まれなケースにおいて、オブジェクトの複製を行う特別な処理が必要となる @@ -1154,8 +1157,8 @@ Object::InsideOutは、オブジェクトフィールド配列 (ハッシュ) から オブジェクトデータを削除するためのC<DESTROY>メソッドを、各クラスに -エクスポートします。クラスに付加的な破棄処理 - (例: ファイルハンドルのクローズ) が必要なら、 +エクスポートします。 +クラスに付加的な破棄処理 (例: ファイルハンドルのクローズ) が必要なら、 C<:Destroy>属性をラベル付けしたサブルーチンを用意する必要があります。 このサブルーチンには、破棄されようとしているオブジェクトが送られます: @@ -1175,7 +1178,8 @@ され、派生の最下層にあるクラスのメソッドだけが呼ばれます。 累積メソッドではこのマスクは取り去られ、階層内の各クラスにある同名のメソッドが 呼ばれます。それぞれの呼び出しによる返値 (がある場合) は、オリジナルの -メソッド呼び出しに対する返値に集められます。例を示します: +メソッド呼び出しに対する返値に集められます。 +例を示します: package My::Class; { use Object::InsideOut; @@ -1266,8 +1270,8 @@ I'm also a My::Foo 上記のように、累積メソッドはC<:Cumulative> - (または S<C<:Cumulative(top down)>> ) -属性でタグ付けされ、クラス階層をI<トップダウンで>伝搬します + (または S<C<:Cumulative(top down)>>) 属性でタグ付けされ、 +クラス階層をI<トップダウンで>伝搬します (つまり、ベースクラスから子クラスへ下向きに降りていきます)。 S<C<:Cumulative(bottom up)>> とタグ付けされた場合は、オブジェクトのクラスから 親クラスへ上向きに伝搬していきます。 @@ -1312,8 +1316,8 @@ } そして、あなたが用意した整形と、全ての親メソッドが提供する整形の適用を -判断したとします。単一の親クラスを持つ場合は通常、 -単に C<$self->SUPER::format_name($name)> +判断したとします。 +単一の親クラスを持つ場合は通常、単に C<$self-E<gt>SUPER::format_name($name)> メソッドを直接呼べば良いでしょう。しかし複数の親クラスを持つ場合は、 各親クラスのメソッドを明示して呼ばなければなりません: @@ -1403,13 +1407,11 @@ C<AUTOLOAD>のような機能を要求するクラスは、C<:Automethod>属性でラベル付けした サブルーチンを用意しなければなりません。 -C<:Automethod>サブルーチンへの引数は、オブジェクトおよび -オリジナルのメソッド呼び出し時に与えられた引数となります - (C<AUTOLOAD>と同じです)。 C<:Automethod>サブルーチンは、 -要求されたメソッドが分かる場合はその機能を実装した -サブルーチンリファレンスを返し、 -そうでない場合は要求の処理方法が不明であることを示すため単にC<return;>で -終了してください。 +C<:Automethod>サブルーチンへの引数は、オブジェクトおよびオリジナルの +メソッド呼び出し時に与えられた引数となります (C<AUTOLOAD>と同じです)。 +C<:Automethod>サブルーチンは、要求されたメソッドが分かる場合はその機能を +実装したサブルーチンリファレンスを返し、そうでない場合は要求の処理方法が +不明であることを示すため単にC<return;>で終了してください。 (全てのクラスにエクスポートされている) C<AUTOLOAD>サブルーチン自身を使うと、 Object::InsideOutはクラスツリーを歩き回り、実装されていないメソッド呼び出しを @@ -1421,8 +1423,7 @@ にアクセスする必要がある場合は、C<$CALLER::_>を使ってください。 オートメソッドはL</"累積 (Cumulative) メソッド">または -L</"連鎖 (Chained) メソッド"> -にすることもできます。 +L</"連鎖 (Chained) メソッド">にすることもできます。 この場合、C<:Automethod>は2つの値を返さなければなりません: メソッド呼び出しを処理するサブルーチンリファレンスと、 メソッド型を示す文字列 (designator) です。 @@ -1585,9 +1586,9 @@ =item C<:Pumper>サブルーチン属性 クラスがC<:Dumper>サブルーチンを用意した場合はおそらく、これと対をなし、 -C<Object::InsideOut::pump()>に代わって -ダンプされたデータからオブジェクトを作成する、 -C<:Pumper>ラベルを付けたサブルーチンを用意する必要があるでしょう。 +C<Object::InsideOut::pump()>に代わってダンプされたデータから +オブジェクトを作成する、C<:Pumper>ラベルを付けたサブルーチンを +用意する必要があるでしょう。 このサブルーチンには、新しく作成されようとしているオブジェクトと、 C<:Dumper>サブルーチンから返されたスカラーが供給されます。 前述のC<:Dumper>の例に対応したC<:Pumper>は、次のようになります: @@ -1603,8 +1604,7 @@ Object::InsideOutは、L<Storable>モジュールを使ったオブジェクトの シリアル化もサポートしています。 -クラスがL<Storable>を使ってシリアル化できることを -指定する方法が2つあります。 +クラスがL<Storable>を使ってシリアル化できることを指定する方法が2つあります。 最初の方法は、あなたのパッケージのObject::InsideOut宣言に、 L<Storable>を追加することです: @@ -1614,9 +1614,10 @@ } そして、あなたのアプリケーションに S<C<use Storable;>> を追加してください。 -これにより、オブジェクトをシリアル化するためのC<-E<gt>store()>および -C<-E<gt>freeze()>メソッドが、逆シリアル化するためのC<retrieve()>および -C<thaw()>サブルーチンが使えるようになります。 +これにより、オブジェクトをシリアル化するためのメソッド +C<-E<gt>store()>およびC<-E<gt>freeze()>と、 +逆シリアル化するためのサブルーチン +C<retrieve()>およびC<thaw()>が使えるようになります。 package main; use Storable; @@ -1653,7 +1654,7 @@ 最初の引数はフィールドを追加するクラスです。 第2引数は1文字目にC<@>かC<%>を付けたフィールド名の文字列で、 -それぞれ配列フィールドがハッシュフィールドかを宣言します。 +それぞれ配列フィールドかハッシュフィールドかを宣言します。 第3引数は S<C<key =E<gt> value>> ペアを含む文字列で、 フィールドアクセサを生成するためC<:Field>属性と共に使われるものです。 @@ -1753,9 +1754,9 @@ =back -Object::InsideOutは通常、 -これらのサブルーチンをクラスおよびアプリケーションコード -から呼び出すことができなくなるようにします (隠してしまいます) +Object::InsideOutは通常、これらのサブルーチンをクラスおよび +アプリケーションコードから呼び出すことができなくなるようにします +(隠してしまいます) (通常これらはObject::InsideOut自身でのみ必要とされるべきです)。 もし必要なら、C<PUBLIC>、C<RESTRICTED>、C<PRIVATE> キーワードを 以下の属性に付加することで、この動作を無効にできます: @@ -1924,8 +1925,8 @@ C<-E<gt>heritage()>は1つ以上のクラス名を引数として呼ぶこともできます。 この場合、指定したクラスのオブジェクトのみが返されます。 -メソッド名が衝突した場合は、 -完全修飾名を使ってC<-E<gt>heritage()>を呼び出せます: +メソッド名が衝突した場合は、完全修飾名を使ってC<-E<gt>heritage()> +を呼び出せます: my @objs = $self->Object::InsideOut::heritage(); @@ -1934,9 +1935,9 @@ =item $self->disinherit($obj [, ...]) C<-E<gt>disinherit()>メソッドは、外部オブジェクトの継承をオブジェクトから -分離 (つまり削除) します。外部オブジェクトは、 -クラスまたは実際に使っている継承オブジェクト -(例えばC<-E<gt>heritage()>により検索したオブジェクト) +分離 (つまり削除) します。 +外部オブジェクトは、クラスまたは実際に使っている継承オブジェクト +(例えばC<-E<gt>heritage()>により検索したオブジェクト) によって指定してください。 この呼び出しは、最初の継承を確立したクラスコード内部で呼び出された場合のみ、 @@ -1951,14 +1952,16 @@ =back B<注意>: 外部継承では、クラスメソッドおよびオブジェクトメソッドだけに -アクセスできます。継承オブジェクトは強くカプセル化されており、継承を +アクセスできます。 +継承オブジェクトは強くカプセル化されており、継承を 行ったクラスのみが継承オブジェクトへ直接アクセスできます。 もしもクラスの外部から、継承オブジェクト自身や、 (I<blessされたハッシュ>に基づくオブジェクトにおける) ハッシュフィールド内部に アクセスする必要がある場合は、それらへのアクセサを書く必要があります。 B<制約事項>: 外部メソッドにアクセスするために完全修飾名を使うことはできません -(カプセル化した外部オブジェクトが含まれる場合)。従って、次の例は動作しません: +(カプセル化した外部オブジェクトが含まれる場合)。 +従って、次の例は動作しません: my $obj = My::Class->new(); $obj->Foreign::Class::bar(); @@ -1966,12 +1969,12 @@ 通常、上のようにする必要はありません: C<$obj-E<gt>bar()>とすれば十分です。 唯一これが問題となるのは、I<ネイティブな>クラスが、継承した外部クラスの -メソッドをI<オーバーライド>したときです (例えば、 C<My::Class> 自身が -C<-E<gt>bar()>メソッドを持つ場合)。 +メソッドをI<オーバーライド>したときです +(例えば、 C<My::Class> 自身がC<-E<gt>bar()>メソッドを持つ場合)。 このようにオーバーライドされたメソッドを直接呼ぶことはできません。 このようなオーバーライドを意図して行っているのであれば、 -これは問題にならないでしょう: オーバーライドをバイパスするコードは -誰も書くべきではありません。 +これは問題にならないでしょう: +オーバーライドをバイパスするコードは誰も書くべきではありません。 しかし、偶然オーバーライドしてしまった場合は、I<ネイティブ>メソッド名を 変更するか、オーバーライドしたメソッドの機能を使えるようにする ラッパーメソッドをI<ネイティブ>クラスが違う名前で提供すべきです。 @@ -2035,8 +2038,8 @@ まず始めに外部継承のための文書化された方法 (つまり、S<C<use Object::InsideOut qw(Foreign::Class);>>) を使うことでしょう。 これが動作するならば、もっともな理由がない限り、このアプローチだけを -使うことを強く推奨します。もしこれが動作しない場合は、 -S<C<use base>>を試してください。 +使うことを強く推奨します。 +もしこれが動作しない場合は、S<C<use base>>を試してください。 =head1 スレッドのサポート @@ -2162,7 +2165,8 @@ あなたのクラスにハンドラを追加するメカニズムを提供します。 あなたの属性ハンドラは、C<MODIFY_*_ATTRIBUTES>と命名する代わりに その他の任意の名前とし、C<:MODIFY_*_ATTRIBUTES> (またはC<:MOD_*_ATTRS>と略した) -属性でラベル付けして下さい。あなたのハンドラは、入力引数に対して +属性でラベル付けして下さい。 +あなたのハンドラは、入力引数に対して L<attributes/"Package-specific Attribute Handling"> で記述されている 動作をし、ハンドラで認識できない属性のリストを返さなければなりません。 例を示します: @@ -2192,7 +2196,7 @@ 属性 '変更' ハンドラはクラス階層をI<上向きに>辿りながら (つまりI<ボトムアップ>で) 呼ばれます。 これにより、子クラスは親クラスの属性処理をI<オーバーライド>できたり、 -(処理しなかった属性のリストを返すことにより) +(処理しなかった属性のリストを返すことにより) 親クラスで処理するための属性を追加できたりします。 I<属性 '取得' ハンドラ>についても同様の手順です: @@ -2201,8 +2205,8 @@ L<attributes/"Package-specific Attribute Handling">での記述とは異なり、 I<属性 '取得' ハンドラ>はB<2つの>引数を受け取ります: 関連のあるパッケージ名と、 -パッケージ定義属性の取得を要求されている -変数またはサブルーチンへのリファレンスです。 +パッケージ定義属性の取得を要求されている変数またはサブルーチンへの +リファレンスです。 属性ハンドラは通常、L<隠しメソッド|/"隠し (Hidden) メソッド">とされます。 @@ -2283,10 +2287,12 @@ } エラーオブジェクトから返されるメッセージと情報ができるだけ有益になるよう、 -私は努力しました。改善への提案を歓迎します。 +私は努力しました。 +改善への提案を歓迎します。 また、Object::InsideOutのコードが原因でエラーが発生したにもかかわらず、 Exception::Classオブジェクトを生成しない状況に遭遇したら、 -私に注意を促してください。このようなエラーの一例です: +私に注意を促してください。 +このようなエラーの一例です: =over @@ -2320,8 +2326,8 @@ } # 'not found' の場合の処理 -同様に、上記の様な動作するにもかかわらずC<$SIG{'__DIE__'}>をローカル化しない、 -他モジュールのコードを呼び出す場合は、 +同様に、上記の様な動作するにもかかわらずC<$SIG{'__DIE__'}> +をローカル化しない、他モジュールのコードを呼び出す場合は、 C<eval>ブロックによって欠陥を回避できます: eval {