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
将尝试通过在 @INC
中按以下顺序查找来加载 MySourceHandler
类
TAP::Parser::SourceHandler::MySourceHandler
MySourceHandler
在错误时 croak
。
make_iterator
my $iterator = $src_factory->make_iterator( $source );
给定一个 TAP::Parser::Source,找到最合适的 TAP::Parser::SourceHandler 来创建 TAP::Parser::Iterator(参见 "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::Object, TAP::Parser, TAP::Parser::SourceHandler, TAP::Parser::SourceHandler::File, TAP::Parser::SourceHandler::Perl, TAP::Parser::SourceHandler::RawTAP, TAP::Parser::SourceHandler::Handle, TAP::Parser::SourceHandler::Executable