型グロブとシンボリックリファレンスで動的にメソッドを追加する

#!/usr/bin/perl
use strict;
use warnings;

package Hoge;

sub new {
    my $class = shift;
    return bless {}, $class;
}

sub mk_accessor {
    my ($self, $accessor) = @_;
    my $class = ref $self || $self;
    my $code = sub {
        my $self = shift;
        $self->{$accessor} = shift if @_;
        return $self->{$accessor};
    };
    no strict "refs";
    *{"${class}::$accessor"} = $code;
}


package main;

my $hoge = Hoge->new;

Hoge->mk_accessor("aaa");
$hoge->aaa("aaa");
print $hoge->aaa;  #=> "aaa"

no strict "refs" の有効範囲はできるだけ小さくすること。my $code〜より前に置くと、サブルーチンの中でもno strict "refs"の効果が有効になってしまう。