@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Moose/Mouse, BUILD, BUILDARGS, MouseX::Getopt

ベンキョーしながら使ってる。以下ただのメモです。

BUILD と BUILDARGS について

たとえばこういうことがしたい: TheSchwartz のワーカー/クライアント両方の親クラスとして、 dsn,user,pass のデフォルト値を持たせたクラスをつくっておいてインスタンスの生成は任せたい。

package MyTheSchwartz;
use Any::Moose;
extends 'TheSchwartz';

has 'dsn' => (is => 'ro', isa => 'Str', default => 'dbi:mysql:schwartz');
has 'user' => (is => 'ro', isa => 'Str', default => 'schwartz');
has 'pass' => (is => 'ro', isa => 'Str', default => sub { reverse split '', 'schwartz' });


1;

こういうときに、 my $worker = MyTheSchwartz->new(); したら $worker isa TheSchwartz になってて $worker->can_do(); $worker->work(); できるようになるといいな、と思ったのだけど、 BUILDARGS だと $self->dsn とかがとれないので has で指定したアトリビュートを参照できない。かといって BUILD だとたぶん $self が作られる時点で TheSchwartz::new() とかに引数が渡らないので無理なのでは・・・と、 Moose::Manual のそれっぽいところを読んでみたけどどうも解決できそうになかったので、またあとで調べることにして lazy_build などをつかってつくり $worker->schwartz->work() とかやることにした。解決できるきもするけど、そもそもこういう extends の使い方は流儀的に有りや無しや。

MouseX::Getopt について

ふだん、 .pl なスクリプトを書くときは常にこう書くように心がけている:

use Getopt::Long;
use Pod::Usage;
my ($help);
GetOptions(
    help => \$help,
) or pod2usage(2);
pod2usage(2) if $help;

あと他にもオプションの引数が増えたりするけど、 --help を指定したときは必ず pod を表示して終了する、ということがしたい。 MouseX::Getopt を使うと GetOptions() とか書かなくていいのでとても楽そうなんだけど、 --help を実現するにはどうしたらいいのかなー。

追記

http://b.hatena.ne.jp/ikasam_a/20090909#bookmark-15918399 で教えてもらいました。ふつうに has 'help' を定義して .pl のほうで pod2usage(2) if $obj->help; とすればいいのかー。