Package::Prototype というモジュールを開発した。 metacpan.org
これは bless($ref :HashRef[, $classname :Str])
メソッドにハッシュリファレンスを与えるとインスタンスを作成し、 _
で始まらないキーに対応する値を返すような動作をするメソッドを stash(Symbol Table Hash) へ登録してくれる。この時、指定した $classname
の stash をリセットしてメソッドを登録する。デフォルトで $classname
は __ANON__
としている。
全部 XS で作成してるため、パフォーマンスは劣らないはず。
以下は Package::Prototype を用いて bless を行う時と通常の bless を行った場合のメソッド定義の振る舞いを確認するためのコードである。(眠すぎてめちゃくちゃ...)
#!/usr/bin/env perl use strict; use warnings; use feature qw/say/; use Package::Prototype; no warnings 'redefine'; sub __ANON__::foo { "Hello" } my $obj = Package::Prototype->bless({ foo => sub { 1234 }, }); say $obj->foo; # 1234 (redefined) sub __ANON__::foo { "Hello" } $obj = bless {}, '__ANON__'; say $obj->foo; # "Hello"
実際に動くコードは SYNOPSIS に記載している。
簡単にインスタンス + メソッドを作成することが可能なため、ぜひ試してほしい。
質問があれば @codehex まで。