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::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]);
    }
}
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 回答