內容

名稱

TAP::Parser::IteratorFactory - 找出可供特定來源使用的 SourceHandler 物件

版本

版本 3.44

語法

use TAP::Parser::IteratorFactory;
my $factory = TAP::Parser::IteratorFactory->new({ %config });
my $iterator  = $factory->make_iterator( $filename );

說明

這是一個工廠類別,它會取得 TAP::Parser::Source 並透過所有已註冊的 TAP::Parser::SourceHandler 執行它,以查看哪一個應該處理來源。

如果您是外掛程式作者,您會感興趣的是如何 "register_handler",如何 "detect_source" 運作。

方法

類別方法

new

建立新的工廠類別

my $sf = TAP::Parser::IteratorFactory->new( $config );

$config 是選配。如果提供,則設定 "config" 並呼叫 "load_handlers"

register_handler

使用此工廠註冊新的 TAP::Parser::SourceHandler

__PACKAGE__->register_handler( $handler_class );

handlers

已註冊的處理常式清單。

實例方法

config

my $cfg = $sf->config;
$sf->config({ Perl => { %config } });

可用來源處理常式的組態的串接 getter/setter。這是一個雜湊,其鍵為處理常式類別,其值包含偵測和建立期間要傳遞給處理常式的組態。類別名稱可以是完全限定的或簡寫的,例如

# these are equivalent
$sf->config({ 'TAP::Parser::SourceHandler::Perl' => { %config } });
$sf->config({ 'Perl' => { %config } });

load_handlers

$sf->load_handlers;

載入 "config" 中定義的處理常式類別。例如,給定組態

$sf->config({
  MySourceHandler => { some => 'config' },
});

load_handlers 將嘗試載入 MySourceHandler 類別,方法是按此順序在 @INC 中尋找它

TAP::Parser::SourceHandler::MySourceHandler
MySourceHandler

發生錯誤時會 croak

make_iterator

my $iterator = $src_factory->make_iterator( $source );

給定 TAP::Parser::Source,找出最適合用來建立 TAP::Parser::IteratorTAP::Parser::SourceHandler(請參閱 "detect_source")。發生錯誤時會結束執行。

detect_source

給定 TAP::Parser::Source,偵測它是哪種類型的來源並傳回 一個 TAP::Parser::SourceHandler(最確定的那個)。發生錯誤時會結束執行。

偵測演算法的工作原理類似於下列

for (@registered_handlers) {
  # ask them how confident they are about handling this source
  $confidence{$handler} = $handler->can_handle( $source )
}
# choose the most confident handler

處理平手的方式是選擇第一個處理常式。

子類別

請參閱 "TAP::Parser 中的「子類別」 以取得子類別概觀。

範例

如果我們做對了,您可能希望撰寫新的來源,而不是對此進行子類別化(請參閱 TAP::Parser::SourceHandler)。

但是,如果您發現有需要...

package MyIteratorFactory;

use strict;

use base 'TAP::Parser::IteratorFactory';

# override source detection algorithm
sub detect_source {
  my ($self, $raw_source_ref, $meta) = @_;
  # do detective work, using $meta and whatever else...
}

1;

作者

Steve Purkis

歸屬

最初從 Test::Harness 剽竊。

由 Steve Purkis 移出 TAP::Parser,並轉換為工廠類別,以支援可擴充的 TAP 來源偵測工作。

另請參閱

TAP::ObjectTAP::ParserTAP::Parser::SourceHandlerTAP::Parser::SourceHandler::FileTAP::Parser::SourceHandler::PerlTAP::Parser::SourceHandler::RawTAPTAP::Parser::SourceHandler::HandleTAP::Parser::SourceHandler::Executable