如何使用Pod :: Weaver为方法定义多个子部分?

时间:2013-01-09 23:59:28

标签: perl methods documentation dist-zilla

我有一些Moose类定义了几组相关的方法。我想在包POD中明白这些组。

我将Dist::ZillaPod::Weaver=method命令一起使用。是否可以在=head2-like命令之间插入一些=method命令以达到预期的效果?

1 个答案:

答案 0 :(得分:2)

我在Redis::Client写了一篇关于我如何为Falling in Love with Pod::Weaver做过的帖子:Pod::Elemental

最简单的方法是向Collect添加自定义weaver.ini指令,并通过为每种类型提供不同的自定义POD命令来组织您的方法,如下所示:

[Collect / FOO METHODS]
command = foo_method

[Collect / BAR METHODS]
command = bar_method

[Collect / BAZ METHODS]
command = baz_method

然后像这样写你的POD

=foo_method blah blah

和Weaver将自动在他们自己的=head1下收集它们。

如果你想做一些比这更复杂的事情,你可以编写自己的Pod :: Weaver插件。要点是在解析的POD中搜索自定义命令名称,并通过返回{{3}}对象来转换它们。这是我写的插件:

package Pod::Weaver::Plugin::RedisLinks;

# ABSTRACT: Add links to Redis documentation

use Moose;
with 'Pod::Weaver::Role::Transformer';

use Data::Dumper;
use Scalar::Util 'blessed';
use aliased 'Pod::Elemental::Element::Pod5::Ordinary';

sub transform_document {
    my ( $self, $doc ) = @_;

    my @children = $doc->children;

    my @new_children;
    foreach my $child( @{ $children[0] } ) {
        if ( $child->can( 'command' )
             && $child->command =~ /^(?:key|str|list|hash|set|zset|conn|serv)_method/ ) {
            my $meth_name = $child->content;
            $meth_name =~ s/^\s*?(\S+)\s*$/$1/;

            my $cmd_name = uc $meth_name;
            $cmd_name =~ tr/_/ /;

            my $link_name = $meth_name;
            $link_name =~ tr/_/-/;

            my $new_para = Ordinary->new(
                content => sprintf 'Redis L<%s|%s> command.',
                           $cmd_name, 'http://redis.io/commands/' . $link_name );

            push @new_children, $child, $new_para;
            next;
        }

        push @new_children, $child;
    }

    $doc->children( \@new_children );
}

__PACKAGE__->meta->make_immutable;

1;

transform_document方法将解析的文档作为参数传递。然后它通过顶级命令查找标记为/^(?:key|str|list|hash|set|zset|conn|serv)_method/的元素,稍微调整名称,然后构建一个包含我想要的格式化POD内容的新POD段落。