perlにおけるprivateなメンバ関数
最近MooseやMouseから離れて、かみさまの祝福にあやかったコードを書いています。
そこでプライベート関数の書き方を忘れていたのでめもめも。とその過程で生まれた疑問があるのでそれについて。
さてここはperlの夢と魔法の国です。もちろんこんな邪悪なコードは動きません。
package Hoge; ~~~ private sub SecretMethod { ~~~ }
サブルーチンは全部神様の祝福を受けてblessされてしまいます。
そこでクラスメソッドの呼び出し規則の影響を受けないように無名関数のリファレンスにてこれを実現します。
素敵なコード例は以下
package Hoge; sub new { my $class = shift; return bless {}, $class; } # private method my $secret_method = sub{ #code reference print "試験始まる前と比べて体重が5kgも増えました(実話)\n"; } sub expose_secret { my $self = shift; $self->$secret_method; #秘密を暴いてやる!! } 1; package main; use Hoge; my $obj = new Hoge::; $obj->expose_secret; # lady's secret has been exposed! # $obj->secret_method, $obj->{secret_method} .... can't call, woohoo :-D
といった具合です。乙女の秘密は守られました。
まあこの用途では隠す必要もないでしょうが、十分に入用だと思います。
この方法で生成したプライベートメソッドはむりやりblessでもしない限りインスタンス側から不可視です。一応直接呼ぶとするなら
sub new{ my $class = shift; return bless { secret => $secret_method, }, $class; } ~~ # main側 &{$obj->{secret}}; # yikes!!
ぐらい無理矢理な手段になります。まあ my $hoge = sub{ を sub hoge{にしてやれば外から見えますけどね。
とまあ、こういった具合でprivateなメソッドが書けるわけですが
「じゃあprotectedなメソッドってどうやって書くんだろう、Attribute::Protectedじゃなくこの形で出来ないのかな」
と思いまして、少し試行錯誤してわからなかったので投げます。ちょっと長くなりそうなので続きは以下。
頭の使いすぎで限界感あるのでこのIssueに関しては明日別のエントリで。