2006 年 4 月 26 日 19 時 57 分

継承に対応させる


このアーカイブは同期化されません。 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]) }



Copyright (c) 1994-2007 Project Loafer. All rights reserved.