我有一些 Moose 类,它们定义了几组相关方法。我想让这些组在包 POD 中显而易见。
我使用andDist::Zilla
命令。是否可以在我的命令之间插入一些命令以达到预期的效果?Pod::Weaver
=method
=head2-like
=method
我有一些 Moose 类,它们定义了几组相关方法。我想让这些组在包 POD 中显而易见。
我使用andDist::Zilla
命令。是否可以在我的命令之间插入一些命令以达到预期的效果?Pod::Weaver
=method
=head2-like
=method
我在这里写了一篇关于我是如何为Redis::Client做到这一点的帖子:Falling in Love with Pod::Weaver。
最简单的做法是向您添加自定义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 中搜索自定义命令名称,并通过返回Pod::Elemental对象来转换它们。这是我写的插件:
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 内容。