Это правильное (предполагаемое) использование MooseX :: Getopt? - PullRequest
2 голосов
/ 12 марта 2019

Является ли это правильным (предполагаемым) использованием MooseX :: Getopt ?В документации не так много примеров.Код работает, но я не знаю, была ли это предполагаемая модель использования.

package AppOpt {
    use Moose;
    use Moose::Util::TypeConstraints;
    use namespace::autoclean;

    with 'MooseX::Getopt';

    enum 'ReportType', [qw( activityByEvent activityByDate final )];
    enum 'FormatType', [qw( text pretty html )];

    has report => ( is => 'ro', isa => 'Str', required => 1 );

    has verbose => ( is => 'ro', isa => 'Bool', default => 0 );

    has format => ( is => 'ro', isa => 'Str', default => "text" );

    __PACKAGE__->meta->make_immutable;
}

package main;
use strict;
use warnings;

my $opt = AppOpt->new_with_options();

printf("original \@ARGV = [%s]\n\n", join(' ', @ARGV));

# Please ignore this tasteless inspection of the object guts. -E
for my $k (keys(%{$opt})) {
    unless($k =~ /(usage|ARGV|extra_argv)/) {
    printf("%s => %s\n", $k, $$opt{$k});
    }
}
exit(0);

В частности: предназначены ли опции для их собственного класса?Я не могу быть уверен из документов.

Кроме того, было бы целесообразно использовать BUILD для дальнейшей проверки параметров?

Это может звучать больше, чем один вопрос, но яне имею в виду это быть.Я уже работал с другими модулями и обнаружил, что неправильно понял, как они были предназначены для использования.

1 Ответ

3 голосов
/ 12 марта 2019

Роль MooseX :: Getopt устанавливает параметры командной строки для атрибутов (кроме тех, которые начинаются с _) класса, с которым он используется (используется). Он не предназначен для «самостоятельного использования».

Итак, вы пишете класс AppOpt с атрибутом report, а когда вы включаете роль MooseX::Getopt, вы можете вызывать программу с помощью --report..., где подробности опций задаются путем максимально возможного вывода об атрибуте. из своего класса. Вот и все. Вы получаете параметры командной строки.

Предоставлено несколько методов доступа, которые можно использовать для проверки того, что произошло в командной строке, указанной в вашем регулярном выражении. Но используйте их в качестве средств доступа (методов), а не прямо тыкаясь в объект.

...