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

Perl 如何使用Pod::Weaver为方法定义多个子部分?,perl,methods,documentation,dist-zilla,Perl,Methods,Documentation,Dist Zilla,我有一些Moose类,它们定义了几个小的相关方法组。我想让这些群体在包装箱中变得明显 我使用Dist::Zilla和Pod::Weaver和=method命令。是否可以在我的=method命令之间插入一些=head2-like命令以达到预期效果?我在这里写了一篇关于我是如何做到这一点的帖子: 最简单的方法是向weaver.ini添加自定义Collect指令,并通过为每种类型提供不同的自定义POD命令来组织方法,如下所示: [Collect / FOO METHODS] command = foo

我有一些Moose类,它们定义了几个小的相关方法组。我想让这些群体在包装箱中变得明显


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

我在这里写了一篇关于我是如何做到这一点的帖子:

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

[Collect / FOO METHODS]
command = foo_method

[Collect / BAR METHODS]
command = bar_method

[Collect / BAZ METHODS]
command = baz_method
然后像这样写你的豆荚

=foo_method blah blah
Weaver将自动在自己的
=head1
下收集它们

如果您想做比这更复杂的事情,您可以编写自己的Pod::Weaver插件。要点是在已解析的POD中搜索自定义命令名,并通过返回对象对其进行转换。以下是我编写的插件:

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;
package-Pod::Weaver::Plugin::RedisLinks;
#摘要:添加到Redis文档的链接
使用驼鹿;
使用'Pod::Weaver::Role::Transformer';
使用数据::转储程序;
使用Scalar::Util'foweld';
使用别名“Pod::Elemental::Element::Pod5::Normal”;
子转换文件{
我的($self,$doc)=@;
我的@children=$doc->children;
我的新孩子们;
foreach my$child(@{$children[0]}){
如果($child->can('command'))
&&$child->command=~/^(?:key | str | list | hash | set | zset | conn | serv)_method/){
我的$meth_name=$child->content;
$meth_name=~s/^\s*?(\s+)\s*$/$1/;
my$cmd_name=uc$meth_name;
$cmd_name=~tr/u/;
我的$link\u name=$meth\u name;
$link_name=~tr//-/;
我的$new\u para=普通->新(
content=>sprintf'Redis L命令',
$cmd_name,'http://redis.io/commands/“.$link_名称);
推送@new_children,$child,$new_para;
下一个
}
推送@new_children,$child;
}
$doc->children(\@new\u children);
}
__包\元->使\不可变;
1.

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

感谢您快速而有用的回答,弗里多!现在,第一种方法对我来说已经足够好了,但我很欣赏第二种方法的可能性。没问题,和Weaver一起玩吧。这是一个非常好的工具。