几个月前,我开始使用驼鹿。
我使用的一些非OO模块只是由相关功能组成。我想在Moose类中使用这些函数作为方法。可能是最简单的方式就像
#!/usr/bin/env perl
package FuncPack;
sub func_1 {
print "-> ", __PACKAGE__, "::func_1 called \n";
}
package FuncClass;
use Moose;
use namespace::autoclean;
sub func_1 {
my $self = shift ;
return FuncPack::func_1(@_);
}
__PACKAGE__->meta->make_immutable;
package main;
my $obj = FuncClass->new();
$obj->func_1(); # shall call FuncPack::func_1
对于一个功能,它可能没问题,但是如果你有很多功能,它就是一个重复的任务而且很无聊。 是否有更聪明的方法来实现它?可能有类似于MooseX :: NonMoose或MooseX :: InsideOut的东西,用于扩展非Moose类?
感谢您的建议或提示。
答案 0 :(得分:2)
Moose通常不处理这个问题,在OO框架中包含非OO模块似乎有点奇怪。但是,如果您有方法列表(或可以生成方法),您可以执行以下操作:
package FuncClass;
use Moose;
my @list = qw( func_1 func_2 func_3 ... );
for my $method in @list {
__PACKAGE__->meta->add_method(
$method => sub { my $s = shift; FuncPack::$method(@_)
});
}
您可以使用Package::Stash
之类的内容从FuncPack
中提取功能列表。
我想知道你为什么要这么做呢?你的FuncClass
将完全没有任何状态,除了添加一个间接层之外,它实际上不起作用。