如何将非OO模块的函数包装到驼鹿类中

时间:2011-05-02 11:50:05

标签: moose

几个月前,我开始使用驼鹿。

我使用的一些非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类?

感谢您的建议或提示。

1 个答案:

答案 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将完全没有任何状态,除了添加一个间接层之外,它实际上不起作用。