日記はScrapboxに移動しました。

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」に続く。

Leave a Reply

Your email address will not be published. Required fields are marked *