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