我正在使用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]);
}
}
答案 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)],
);