けメモこの広告は、90日以上更新していないブログに表示しています。CPANClass::Accessor::GroupedはDBIx::Classの親クラスの一つです。*1DBIx::Classを理解する上で避けれないので調べてみました。簡単に言えばあるクラスのインスタンスが他のクラスのインスタンスを持つような場合に、その他のクラスのアクセサへのショートカットを簡単に作る為のモジュールと言えます。a3へ直接アクセスするアクセサも持つみたいなケースで使えます。($aにぶち込む)$a->b1は$b->b1と同じ事って事です。コードに落とすとこんな感じ。$b->b1;$bのb1も10になってます。@fields)ここはグループ名を決めて、そのグループ名をsuffixに持つget_/set_アクセサがある前提で@fieldsにあるメソッドを本体に生やします。長いけど、適宜僕の方でコメントを入れました。}}と言う流れですね。@fieldsの各要素がリファレンスでも良い事になってるのはまぁ置いといて、make_group_accessorを見てみます。get_$groupに依存したアクセサを作ってるのはコードを見ればすぐ分かりますね。nameと言うアクセサがFooに生えるよって事ですね。set_base/get_baseってのは最初からある訳じゃないので、自分で作らないとダメ。これは先のサンプルコードでもやった通りです。それじゃ面倒なんで、set_inherited/get_inheritedってメソッドは最初からあって、inheritedグループに突っ込むと由なにやってくれます。$new_value)/get_inherited($field)えーっと、ここはちと難しい。};}まずはインスタンスメソッドとしてコールされた場合で、そのインスタンスがHASHREFをblessしてる場合は、そのキーにフィールド名$field、値に$new_valueを突っ込みます。逆にクラスメソッドの場合は、"__cag_$field"と言う名前のパッケージ変数があると見なして突っ込みます。undef;}後半ややこしいですね。@{mro::get_linear_isa($class)};};と言う実装。mroと言うpackageはMRO::Compatをuseすると使えます。get_linear_isa()はメソッド探索順に継承しているpackageを返します。このset_inherited/get_inheritedを簡単にまとめると、インスタンスメソッドの場合はHASHREF前提で、そのフィールド名のキーがblessされたHASHREFに存在する事が前提クラスメソッドの場合は"__cag_$field"と言うpackage変数が存在する事が(継承ツリーのどっかにある事が)前提*2って事になります。最初に挙げたサンプルとはちょっと違う使い方になりそう。言うのもDBICではクラスメソッドとしてinheritedを利用してるんですが、これってクラス変数的なノリで使ってるのかなーと推察。C3の探索順に合わせんが為にget_super_paths()があるのかなと予想。月別アーカイブはてなブログをはじめよう!ZIGOROuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。