内容

名称

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