Moose を使用して REST サーバーのクライアントを作成し、呼び出しをオブジェクトにマップしようとしています。呼び出しの多くは単純で、ボイラープレート関数を使用してプリフェッチするため、before
各クラス内で実際の関数を作成する関数をエクスポートして使用しようとしています。
package R::A;
use Moose;
use R::Util qw(make_befores);
has 'var' => (is => 'rw', isa => 'Str');
make_befores('/servercall/' => ['var']);
1;
package R::Util;
use Moose; use Moose::Exporter;
sub make_befores {
while (my ($c, $vs) = each(@_)){
before $vs => sub {
# make call and set object values
};
}
}
Moose::Exporter->setup_import_methods(
as_is => [ 'make_befores', ],
);
1;
それはおそらく不完全であり、間違いなくテストされていませんが、要点を伝えていると思います. を呼び出すと、すべての変数などと同じように呼び出されないためmake_befores
、のコンテキストで呼び出され、壊れます。にコピー アンド ペーストするだけで機能します。ただし、これは複数のクラスで使用されるため、インポート可能な関数にしたいと考えています。R::Util
R::A
make_befores
R::A
それとも、私はこれについてすべて間違っていますか?
更新しました:
Fuji Goro の解決策はうまく機能しましたが、私のような Moose の初心者にはわかりにくかったので、最終的には次のようになりました。
sub make_befores {
my $meta = shift;
while (my ($c, $vs) = each(@_)){
my $sub = sub { ... };
Moose::Util::add_method_modifier($meta, before => [$vs => $sub]);
}
}