13.12 AUTOLOADで属性メソッドを生成する

自分で作成するオブジェクトにおいて、複数のデータフィールドを設定したり、取得したりするためのアクセッサメソッドが必要である。ただし、それら全てを一度に一つずつ書く手間を簡略化したい。

PerlのAUTOLOADメカニズムを一種のプロキシメソッド生成手段として慎重に使用することによって、新しいデータフィールドを追加するたびにそれらのメソッドを全て自分で作成する手間を省くことができる。

package Person;
use strict;
use Carp;
our(%ok_field);

# 4個の属性フィールドの使用を承認する
for my $attr ( qw(name age peers parent) ) { $ok_field{$attr}++; }

sub AUTOLOAD {
  my $self = shift;
  my $attr = our $AUTOLOAD;
  $attr =~ s/.*:://;
  return unless $attr =~ /[^A-Z]/;  # DESTROYと大文字だけのメソッドを飛ばす
  croak "invalid attribute method: ->$attr()" unless $ok_field($attr);
  $self->{uc $attr} = shift if @_;
  return $self->{uc $attr};
}

sub new {
  my $proto = shift;
  my $class = ref($proto) || $proto;
  my $parent = ref($proto) && $proto;
  my $self = {};
  bless($self, $class);
  $self->parent($parent);
  return $self;
}

1;