Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Perl で楽々アクセサ作成について考えてみた - その 3

たくさんの方々にあれこれ教えていただきつつ「antipop2.0: Perl で楽々アクセサ作成について考えてみた - その 2」にて作成した Class::AutoAccess::Linked をちと手直ししたりモジュールとしての体裁を整えたりした後、なんとなく名前を変更してみたりして、CPAN にうpってみました。僕の着想など跡形もなく消え果てているのですが、まず言い出しっぺより始めよ、ってことで。

package MyClass;

# inherit Class::AutoAccess::Deep and that's all
use base qw(Class::AutoAccess::Deep);

sub to_check {
    # write your own processing code...
}

package main;

my $data = {
    foo      => undef,
    bar      => {
        baz  => undef,
    },
    to_check => undef,
};

my $obj = MyClass->new($data);

# now, you can access the fields as described below
$obj->foo('new value');        # set "new value"
my $foo = $obj->foo;           # get "new value"

# you can access the field chain deeply
# by joining field name with '->'
$obj->bar->baz('other value'); # set "other value"
my $bar_baz = $obj->bar->baz;  # get "other value"

# your own method called correctly
my $value = $obj->to_check;

TODO でも述べている通り、現状ではアクセサを呼び出すたびに AUTOLOAD することになるってな非効率的な実装になっているので、一度呼び出したアクセサをなんらかの方法で保存して、再利用できるようにしたい。そのためには、たとえば以下の方法が考えられる。

  1. 各 ハッシュリファレンスは Class::AutoAccess::Deep の再帰構造となるのだが、それぞれのすでに生成されたインスタンスに、どうにかして一度呼び出されたアクセサメソッドをぶっこむ
  2. ハッシュリファレンスの階層をたどって Class::AutoAccess::Deep オブジェクトを連続的に作成するときに、ISA をいじってたとえば Class::AutoAccess::Deep::SandBox::1, Class::AutoAccess::Deep::SandBox::2 ... というような感じで、一意のパッケージ名をでっちあげ、そのパッケージ内に一度呼ばれたアクセサをぶっこむ

1 点目については、いったいぜんたい、そもそもこんなことできるんでしょうか……。2 点目については、なんとかなりそうな気がするけど、なんかあんまりいい方法じゃぁないような気がするなー、ってんで、いまんとこ保留中。

Perl で楽々アクセサ作成について考えてみた - その 4」に続く。