2

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::UtilR::Amake_beforesR::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]);
    }
}
4

1 に答える 1

2

beforeは、MOP への単なる構文糖衣です。を参照してくださいMoose.pm。MOP を直接使用するか、この場合はMoose::Util::add_method_modifier()andを使用できます。with_meta

use Moose::Util;
use Moose::Exporter;

sub make_before {
    my($meta, @methods) = @_;
    Moose::Util::add_method_modifier($meta, before => \@methods);
}

Moose::Exporter->setup_import_methods(
    with_meta => [qw(make_before)],
);
于 2013-06-26T23:28:41.970 に答える