オブジェクト

オブジェクト指向なモジュールの書き方を勉強したけど、忘れてた。
プログラミングPerlのコードをちょこっと変えたものを書いてみる。

モジュール
package Person;
use strict;

#引数を受け取るコンストラクタ
sub new {
    my $invocant = shift;
    my $self = bless({}, ref $invocant || $invocant);
    $self->init(@_);
    return $self;
}
#初期化処理
sub init {
    my $self = shift;
    $self->name(shift) if (@_);
}

#クロージャを使ってクリーンかつ効率的に
for my $field (qw(name)) {
    my $slot = __PACKAGE__ . "::$field";

    no strict "refs";
    *$slot = sub {
        my $self = shift;
        $self->{$field} = shift if @_;
        return $self->{$field};
    }
}
1;
テスト
use strict;
use Person;

my $kotaro = Person->new("kotaro");
print $kotaro->name, "\n";