アクセサにはClass::Data::Accessor

アクセサの生成に関してなんのモジュール使おうか色々迷ってたんだけど踏ん切りがついた。

今後はClass::Data::Accessorを使おう。

今まではClass::Accessor::Fast使ってたんだけどset,getやnewが用意されてたり、その他色々なプライベートメソッドが用意されてたりとあんまし好きじゃなかったのね。
もっとシンプルな奴無いのかと。

単純にsetter,getter提供してくれるメンバ変数と同名のアクセサが欲しいだけなのに。

と、いうわけでClass::Data::Accessorなのです。

こいつの便利なところはクラスのアクセサー(Class::Data::Inheritableっすね)とオブジェクトのアクセサーの両方を提供してくれるところです。
また、アクセサを生成するためのメソッドが一つだけなところもポイント高いです。

初期値の設定がすんごいやりやすいし、継承した場合の初期値の設定とかもクールにかけて最高っすよ。

 package Hoge;
 use base qw/Class::Data::Accessor/;
 __PACKAGE__->mk_classaccessor('hoge');
 __PACKAGE__->hoge(1); # 初期値設定
 
 sub new {
     my $class = shift;
     return bless {} , ref $class || $class;
 }
 
 my $hoge = Hoge->new;
 print $hoge->hoge; # 1
 $hoge->hoge(3);
 print $hoge->hoge; # 3
 print Hoge->hoge;  # 1

ちゅう感じですねー。使いやすい。
継承する場合も、

 package Muge;
 use base qw/Hoge/;
 __PACKAGE__->hoge(2); ### 初期値を2にかえちゃう。
 
 my $hoge = Hoge->new;
 print $hoge->hoge; # 2

という風に楽に設定できる。
もしこれを普通にやろうと思えばnewをオーバーライドしてわざわざメンバ変数の値を書き換えないといけないもんね。

 package Muge;
 use base qw/Hoge/;
 sub new {
     my $self = shift->SUPER::new();
     $self->{hoge} = 2; ## こんな感じで
     $self;
 }

さらに言うと上記のようなやり方だとSUPERのnewでhogeを利用している場合に初期値設定できないしね。

というわけでオススメ。