Perlモジュール「Moo」(Moose)の使い方をまとめてみる

便利なPerlモジュール「Moo」の使い方についてまとめていきます。

日本語情報はもちろん、英語でも中々情報が転がっていないので、必死にまとめた情報を備忘録として書きます。

MooとかMooseとかMouseの違いって何なの?

Mooの事を調べているとMouseとかMooseとか色々出てきますが、元々は「Perlで気軽にオブジェクト指向をやるためのモジュール」として、最初に生まれたのがMooseです。

その後、「Perlでオブジェクト指向を楽にしたいけど、Mooseほど機能は要らないかな」と言う事で産まれたのが、MouseとかMooです。

実際にMooやMouseの公式ドキュメントを読むと、以下のように記載されています。

Mouse - Moose minus the antlers (Mouse - Mooseからツノを取ったもの)

Mouse - Moose minus the antlers - metacpan.org

Moo - Minimalist Object Orientation (with Moose compatibility)

Mooseをコンパクトにしたもの

Moo - Minimalist Object Orientation (with Moose compatibility) - metacpan.org

なので、「Mooのことを調べたいな」と思ったら、大体Mooseで検索した方が情報が出る時が多いです。(perldocで紹介されているのもMooseです)

Mooの使い方

では、以下はMooの使い方をまとめていきます。

has

Mooのhasメソッドは、他言語で言う「インスタンス変数」を定義できるメソッドです。例えば、以下のように使います。

use strict;
use warnings;
use 5.10.0;

package Sample {
    use Moo;

    has 'name' => (
        is => 'ro',
    );
}

my $sample = Sample->new(name => 'tarou');
say $sample->name; // tarou

has 'name' => ( );nameの部分でインスタンス変数を定義しており、その後に続く()の部分でそのインスタンス変数の振る舞いを定義しています。

上記の例では、is => 'ro'となっているので、name変数の読み込み専用のアクセスメソッドも定義されることになります。

isの値として定義できるのは、以下の通りです。

  • rw 読み書き両方のメソッドを定義
  • lazy 遅延評価メソッドを定義

読み込み、書き込みメソッドのデフォルト名のは変数名と同じ、遅延評価メソッドのデフォルト名は_build_nameのような感じですが、以下のように自分でメソッド名を決めることもできます。

    has 'name' => (
        is => 'rw',
        reader => 'get_name',
        writer =>  'set_name',
    );

   has 'age' => (
        is => 'lazy',
        builder => 'hogehoge',
   );

   sub hogehoge {};

一気にまとめてインスタンス変数を定義したい場合は、配列として与えればいけます。

has [qw(attr1 attr2 attr3)] => (
  is => 'ro',
);

また、変数の型チェックをしたい場合は、isaを使えばOK。

has 'name => (
  is => 'ro',
  isa => 'Str'
);

上記の例では、文字列しか認めないと言う風に型チェックをしています。どのような型チェックを定義できるかは、以下の公式ドキュメントが詳しいです。

参考:Moose::Manual::Types - Mooseの型システム - perldoc.jp

isa => sub {};のように定義することで、オレオレ型チェックもできます。

また理解でき次第、更新していきます。