你可以在具有本地上下文的导入函数之前调用Moose ::

时间:2013-06-26 21:37:15

标签: perl moose

我正在使用Moose为REST服务器编写客户端,并尝试将调用映射到对象中。由于许多调用很简单并且将使用样板函数来预取它,我试图使用export函数在每个类中创建实际的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]);
    }
}

1 个答案:

答案 0 :(得分:3)

before只是MOP的一种语法糖。见Moose.pm。直接使用MOP,或者在这种情况下可以使用Moose::Util::add_method_modifier()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)],
);