読者です 読者をやめる 読者になる 読者になる

MouseX::Getoptのメモ

perl

一文字のオプションと長いオプションを指定したいということが
あるかと思うのですが、MouseX::Getoptでどうやるんだろってことで
実際にコードを書いて調べてみました。まあ hasを 2つ作ればいいの
かなとか考えたんですけど、Getopt::Longと一緒でよくないかなと
思って書いてみたら、それでいいようです。


とりあえずこのようなコードを書きます。
(追記 traitsを使うよう修正しました)

#!/usr/bin/env perl
package Sample;
use Mouse;

with 'MouseX::Getopt';

has 'long' => (
    traits => ['Getopt'],
    is => 'rw',
    isa => 'Str',
    required => 1,
    cmd_aliases => 'l',
    documentation => 'long or l',
);

__PACKAGE__->meta->make_immutable;

no Mouse;

package main;
my $app = Sample->new_with_options();


それでこれをオプションなしで起動するとエラーとなるはずなので
そのときの出力メッセージを見ます。

Required option missing: long
usage: moosex_getopt.pl [-?l] [long options...]
        -? --usage --help  Prints this usage information.
        -l --long          long or l


期待通り -lと --longが定義されていますね。割とよく使いそうだから
perldocにサンプルであってもいいかなって思うんですけどね。これぐらい
常識だよ、ってことなんでしょうか。

追記

コードを全面的に修正しました。id:gfxさんのコメント通り、traitsを
使うのが正攻法です。コードを見たところ'|'でつないでうまくいくのは
たまたまです。'|'でつなぐ方法だと、値の参照・設定時に予期せぬ自体に
なってしまったので、traitsを使いましょう。