有沒有更簡單或更好(= >維護更容易)的方式來使用Perl和Moose
實例化基於傳入數據的類?如何在Perl和Moose中編寫工廠代碼?
以下代碼是我正在處理的項目中的一個精簡示例。
package FooBar;
use Moose;
has 'SUBCLASS' =>('isa'=>'Str',required=>'1',is=>'ro');
has 'MSG' =>('isa'=>'Str',required=>'1',is=>'ro');
sub BUILD {
my $self = shift;
my ($a)[email protected]_;
bless($self,$a->{SUBCLASS})
}
sub Hi {
my $self=shift;
print "Hi, I'm a " . ref($self) ." and I say [". $self->MSG()."]\n";
}
package Foo;
use Moose;
extends ("FooBar");
package Bar;
use Moose;
extends ("FooBar");
package main;
use strict;
use warnings;
for my $line (<DATA>) {
my ($case,$msg)=split(/[\n\r,]\s*/,$line);
FooBar->new(SUBCLASS=>$case,MSG=>$msg)->Hi();
}
__DATA__
Foo, First Case
Bar, Second Case
編輯:它只是讓我吃驚,這是相當多的,當你調用DBI會發生什麼。根據您傳遞的參數,它會使用完全不同的代碼,同時保持(大部分)一致的接口
謝謝,需要我一段時間grok :-) – lexu 2009-08-07 15:39:45
**有[qw(SUBCLASS MSG)] =>(is =>'ro',required => 1); **巧妙的技巧..但「不直觀的」對於任何不熟悉perl的人來說。 – lexu 2009-08-07 15:53:29
不,它不是。它是Moose API的一部分,與Perl無關。 (如果你想變得不直觀,你可以寫下「對於qw/SUBCLASS MSG /有$ _ =>(...)」,但是當然,每個人都知道這也是。) – jrockway 2009-08-07 18:14:26