2011-05-02 47 views
1

幾個月前我開始使用Moose。如何將非OO模塊的函數包裝到駝鹿類中

我使用的一些非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類的東西嗎?

感謝您的建議或提示。

回答

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::StashFuncPack拉出的功能列表。

不知道爲什麼你會想要做這個開始?你的FuncClass將會攜帶絕對沒有狀態,並且除了增加一層間接尋址之外,其實並沒有其他作用。

+0

謝謝。這就是我一直在尋找的。我的例子太簡單了 - 只是爲了清楚我需要什麼。到目前爲止,我還沒有碰過元件。我認爲是時候了;-)。 – katastrophos 2011-05-02 15:00:43