このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
property.pm を動的呼び出しに対応させるには、
インタフェースを変更しなければならない。
従来はコードリファレンスを受け取っていたが、
新しい考え方では、メソッド名を渡すことになる。
幸い、リリース段階でないので、
今後のことを考えてインタフェースを変更しよう。
引数をハッシュで渡すのは効率が悪いので、
ハッシュリファレンスを使うことにする。
use property {
'name' => 'salary',
'get' => 'get_salary',
'set' => 'set_salary'
};
モジュールを修正するのは簡単だ。
文字列であろうが、コードリファレンスであろうが、
単にスカラ変数に格納されていることに変わりはないので、
モジュールのコード上では、getter/setter を
呼び出している部分だけを変更すれば済むのだ。
sub FETCH {
my $this = $_[0];
my $method = $this->{'get'};
$this->{'object'}->$method;
}
sub STORE {
my ($this, $value) = @_;
my $method = $this->{'set'};
$this->{'object'}->$method($value);
}
文字列を使ったメソッドの呼び出しは、
アロー演算子の右側はスカラ変数である必要がある。
アロー演算子や括弧の優先順位の問題があるため、
ここではメソッド名を一度変数に格納している。
# 因みに、上記をサボって一気に書くとこうなる。
sub FETCH { $_[0]->{'object'}->${\$_[0]->{'get'}} }
sub STORE { $_[0]->{'object'}->${\$_[0]->{'set'}}($_[1]) }