Как определить несколько подразделов для методов с Pod::Weaver?
У меня есть несколько классов Moose, которые определяют несколько небольших групп связанных методов. Я хотел бы сделать эти группы очевидными в пакете POD.
я использую Dist::Zilla
а также Pod::Weaver
с =method
команда. Можно ли вставить некоторые =head2-like
Команды между моими =method
Команды для достижения желаемого эффекта?
1 ответ
Я написал пост о том, как я сделал это для Redis::Client здесь: Влюбиться в 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
и ткач автоматически соберет их под себя =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, которое я хочу.