Как определить несколько подразделов для методов с 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, которое я хочу.

Другие вопросы по тегам