2012-10-14 44 views
2

我正在嘗試使用大量crud動作來製作crm應用程序。所以我有控制器類如如何調用一個類:perl中運行時確定的方法?

CRM::Cities 
CRM::Countries 

沒有我使用ORLite作爲輕量級ORM。它創建 - 在飛行類像這樣

Model::Cities 
Model::Countries 

現在說我想要加載一個城市。在CRM ::城市I類必須做類似 (ORLite用來訪問類的方法)

$obj1 = Model::Cities->load($id); 

要加載當前國家在CRM ::國家

$obj1 = Model::Countries->load($id); 

所以我結束在每個控制器類中包含類似的行。

我會希望能夠待辦事項是做的CRM軟件包的東西一般是這樣的(基控制器類):

$obj1 = Model::$package->load($id); 
# package contains Cities or Countries, determined at runtime 

我有各種變化試過,有EVAL等,但這是更高階perl。我認爲ORLite方法是類方法,繼承不太明顯。有人可以提供建議嗎? tia!

回答

4

只要把整包的名稱,例如Model::Cities,放入變量中。例如:

package Stuff::Yeah; 

sub whatever { 
    print "yes\n"; 
} 

package main; 

my $package = "Stuff::Yeah"; 
$package->whatever; 
+0

或者使用引號:' 「型號:: $包」 - >負載($ ID);' – cjm

0
die unless $package =~ /\A\w+\Z/; 
eval "require Model::$package" or die [email protected]; 
$obj1 = "Model::$package"->load($id); 
0

Perl中,您可以使用字符串作爲類名,所以可以說

$obj1 = "Model::Cities"->load($id); 

或確實

$obj1 = "Model::$package"->load($id); 

而事實上

my ($package) = $class =~ /([^:]+)$/; 
$obj1 = "Model::$package"->load($id); 

這是加載的東西一個很好的通用的方式,但我建議一個抽象層以上,以避免過於嫁給了一個模型每CRM包的想法:

sub _model_class { 
    my ($class) = @_; 

    my ($package) = $class =~ /([^:]+)$/; 
    return "Model::$package"; 
} 

然後

$obj1 = $class->_model_class->load($id); 

。這樣,如果其中一個繼承類發展了自己的模型類應該是什麼的想法(並且發生了這種情況),則不需要更改任何代碼。

相關問題