■2005-09-09
* [Perl][メモ] 楽々?アクセサ作成
Perl で楽々アクセサ作成について考えてみたで、可能な限り簡単に$obj->author->nameを実現しようとClass::Accessor::Linkedを書いてみました。author以下のデータにアクセスするために、ハッシュリファレンスをAUTOLOAD可能なオブジェクトにすることで矢印を連結しています。
というわけで効率は悪いし、最初にデータ構造を用意しておかないと深いところのデータが利用できないなど問題が多々があり、実用性はありません。あくまでも$obj->author->nameを実現してみたかったということで。
本当はちゃんとデータ構造を反映したaccessorを生成してあげないといけないのですが、お昼休みではそこまでできませんでした。
* [Perl][メモ] autobox::PropHash
Class::Accessor::Linkedは多少なりともお役に立ったようです(Perlで楽々アクセサ作成〜その2)。 良かったよかった(山科さんのコードはperl5.8.3未満でクラッシュするとありますが、perl本体というよりTest::*系の問題っぽいですね)。
さて、せっかくですので、autoboxを使ってハッシュリファレンスも同様にしてしまいましょう。ということで書いたのがautobox::PropHashです。えらくあっさりしたコードですが。 autoboxとautobox::Coreが必要です(ただしautobox::Coreは便利なメソッドが使えるように継承しているだけ)。
use autobox;
use autobox::PropHash;
my $obj = {a => {b => 'c'}};
print $obj->a->b;
$obj->a->b = 'foo!';
print $obj->a->b;
$obj = {};
$obj->a = 1;
print $obj->a;
$obj->b = [qw/foo bar hoge/];
print $obj->b->join(','); # foo,bar,hoge
print $obj->keys->join(','); # a,b
AUTOLOADとlvalueを使うことで $obj->a->b = 'foo!' なところが粋だと思いませんか? 思いませんか。そうですか。
[]

