有兩種策略 - 檢查符號表以初始化創建,或使用AUTOLOAD並使用can
進行測試。
sub AUTOLOAD {
my $self = shift;
my $method = $AUTOLOAD;
$method =~ s/.*://; # strip package name
if ($self->{'result'}->can($method)) {
return $self->{'result'}->$method(@_);
} else {
croak "Unknown method : $method";
}
}
但符號表訣竅是脆的,因爲如果他們正在使用繼承,你不會看到繼承:當你要處理的情況下該方法是不存在的AUTOLOAD可以梅西耶方法也沒有向上走@ISA。典型的 - (即使他們不是,他們可能會開始在未來,這將導致事情打破使用繼承)
...
,當你試圖複製另一個模塊的接口,你得趕緊繼承的情況下,所以你可能要問自己的關係是什麼::d
和::e
之間:
a::b::c::d
是a::b::c::e
a::b::c::d
使用a::b::c::e
如果它是一個is-a關係,它通常更適合繼承(儘管你可能在每個方法周圍都有包裝,並且仍然需要通過整個練習)。如果它是一個使用關係,賠率是你不希望從他們每一個最後的方法繼承,並可以直接硬編碼的列表(儘管該列表可能,如果使用的一類更新更改)
foreach my $method (@list_of_methods_to_copy) {
*{$method} = sub {
my $self = shift;
return $self->{'results'}->$method(@_);
}
}
來源
2010-06-21 12:08:12
Joe
'a :: b :: c:e'不是一個有效的軟件包名稱,但是小寫的名稱不應該使用。 – Ether 2010-06-21 15:10:17
爲測試目的很好..我猜。但是最佳派對是不對的 – Tree 2010-06-24 13:05:09