Moose > Moose::Manual

題名

Moose::Manual - Mooseとはなにか、どうやって使うのか

Mooseとはなにか?

Mooseは、Perl 5のために書かれた「完全な」オブジェクトシステムです。現代的なオブジェクト指向言語をなにかひとつ思い浮かべてみてください(Perl 5は決して現代的なオブジェクト指向言語ではありません)。アトリビュートを宣言したり、オブジェクトを構築したり、継承を行ったり、あるいはもっといろいろできるかもしれませんが、そのような作業のためのキーワードが用意されていますし、その実装がどうなっているかなんてだれも気にとめません。

Mooseが目指すところも同じです。本当に新しいキーワードを作ることはできませんが、Mooseはそれとよく似た「シュガー」を提供していますし、なにより、Mooseを使うと「クラスを宣言的に定義できる」ようになります。ブレスされたハッシュリファレンスやアクセサメソッドなどはもう気にしなくてもよくなるのです。

また、Mooseを使えばクラスの「論理的な」構造だけを気にすればよくなります。「どうやって」ではなく「なに(が、を)」の部分に集中できるようになるのです。Mooseを使ったクラス定義は、非常に簡潔な英文が並んでいるように見えます。

MooseのベースとなっているのはClass::MOPというメタオブジェクトプロトコル(MOP)です。MOPのおかげで、MooseはMooseを利用しているすべてのクラスに完全なイントロスペクションを提供できます。つまり、それぞれのクラスに問い合わせれば、アトリビュートや親クラス、子クラス、メソッドなどの情報が得られるわけです(これらの情報はすべて明確に定義されたAPIから取得できます)。MOPによる抽象化のおかげで、シンボルテーブルをいじったり@ISA変数の中身を見たりといった、私たちがよく知り、愛用している(?)泥臭いトリックをいっさい使わなくてもすむようになるのです。

Mooseの元になったのはもっぱらPerl 6のオブジェクトシステムですが、CLOSやSmalltalkのように、ほかにもさまざまな言語の精髄を取り込んでいます。

なぜMooseを使うのか?

Mooseは、Perl 5のオブジェクト指向プログラミングをより手軽で強力なものにしてくれます。強力なツールを宣言的で使いやすい高レベルAPIで隠蔽していますので、なにより魔法使いでなくても使えるのがよいところです。

ただし、その気になれば、強力なイントロスペクションAPIを利用・拡張してオブジェクトの内部に手を入れることもできます。

  package Person;

  use Moose;

  has 'first_name' => (
      is  => 'rw',
      isa => 'Str',
  );

  has 'last_name' => (
      is  => 'rw',
      isa => 'Str',
  );

  no Moose;
  __PACKAGE__->meta->make_immutable;

これは「実際に利用可能な、完全な」クラス定義の例です。

  package User;

  use DateTime;
  use Moose;

  extends 'Person';

  has 'password' => (
      is  => 'rw',
      isa => 'Str',
  );

  has 'last_login' => (
      is      => 'rw',
      isa     => 'DateTime',
      handles => { 'date_of_last_login' => 'date' },
  );

  sub login {
      my $self = shift;
      my $pw   = shift;

      return 0 if $pw ne $self->password;

      $self->last_login( DateTime->now() );

      return 1;
  }

  no Moose;
  __PACKAGE__->meta->make_immutable;

このコードを逐一説明する役目はほかのドキュメントにゆずりますが、よくあるオブジェクト指向のイディオムがシンプルな宣言文になっている様子はわかるはずです。

目次

このマニュアルにはいくつかのドキュメントが含まれています。

Moose::Manual::Concepts

ここではMooseのコンセプトを紹介します。また、「従来の」Perl 5オブジェクト指向プログラミングとの対比も行います。

Moose::Manual::Unsweetened

クラスのサンプルを2つ紹介します。いずれもまずはMooseで、次に「従来のPerl 5」で書いたものです。

Moose::Manual::Classes

Mooseはクラスの中でどう使えばよいのでしょうか。また、Mooseのクラスでサブクラスを利用するにはどうすればよいのでしょうか。

Moose::Manual::Attributes

アトリビュートはMooseによるオブジェクト指向システムの根幹をなす部分です(アトリビュートというのはオブジェクトが保持するデータのことです)。Mooseにはアトリビュート関連の機能もたくさんあります!

Moose::Manual::Delegation

アトリビュート自体がオブジェクトの場合、委譲を利用すると便利です。

Moose::Manual::Construction

Mooseではどのようにオブジェクトが構築されるか、とりわけBUILDBUILDARGSメソッドについて学びましょう。また、DEMOLISHによるオブジェクトの破壊も扱います。

Moose::Manual::MethodModifiers

メソッドモディファイアを使うと「あるメソッドを呼ぶ前に別のメソッドを実行する」とか「あるメソッドを別のコードでラップする」といった書き方ができるようになります。メソッドモディファイアは特にロールの中やアトリビュートアクセサに対して利用すると便利です。

Moose::Manual::Roles

ロールは(「デバッグ可能」とか「出力可能」といった)クラスの動作をあらわすものです。ロールを使うと継承とはまったく別のやり方でクラスに振る舞いを追加することができます。

Moose::Manual::Types

Mooseの型システムを使うと、アトリビュートに持たせられる値を厳密に定義できます。

Moose::Manual::MOP

MooseのメタAPIシステムを使うと、クラスに親クラスや子クラス、メソッド、アトリビュートなどを問い合わせることができます。

Moose::Manual::MooseX

このドキュメントではCPANにあがっている中でも特に有用なMooseの拡張モジュールをいくつか紹介します。

Moose::Manual::BestPractices

Mooseにはさまざまな機能がありますし、使い方も決して一通りではありません。でも、使う機能は一部にしぼって、いつもそれを使うようにした方が、みなさんのためになると思います。

Moose::Manual::FAQ

Mooseについてのよくある質問です。

Moose::Manual::Contributing

Mooseのハックに興味がある方はご覧ください。

Moose::Manual::Delta

このドキュメントでは、後方非互換なものをはじめとするMooseの大きな変更点を説明しています。

Mooseを使うべき理由

ここは、ここまで読んでもまだ「どうして使う必要があるんだろうか」とお悩みの方のためのセクションです。

これ以上オブジェクトシステムを増やしてどうするの!?!?

たしかにPerl 5にはオブジェクトを構築する方法がたくさんありますし、その多くがインサイドアウト式のオブジェクトなどをベースにしているのもわかっていますが、Mooseは違います。新しいオブジェクトシステムではなく、既存のオブジェクトシステムを拡張するものだからです。

Mooseは、Class::MOPというPerl 5のメタクラスシステムの上に作られています。つまり、Mooseは通常のPerl 5オブジェクトの作り方を改善するだけでなく、メタクラスプログラミングの能力を提供するものでもあります。

本当に使えるの? それともただの実験?

Mooseの「ベース」となっているのは、スティーヴンがPerl 6のメタモデルのために実装したプロトタイプなどの実験作ですが、Mooseは実験作やプロトタイプではありません現実のものです。

本番環境でも使えるの?

はい。

Mooseはこれまで多くの企業や個人が本番環境での運用に成功してきました。もう何年もほとんど(あるいはまったく)問題なく動作しているアプリケーションもいくつもあります。Mooseは非常に安定していると思っていますし、安定し続けるように努力もしています。

もちろん最終的には自分で決断していただく必要はありますが、疑問や不安があるなら、お気軽に作者のスティーヴンやmoose@perl.orgのメーリングリストにメールをください。あるいはirc.perl.org#mooseに立ち寄って質問してくださっても結構です。

Mooseは要するにPerl 6をPerl 5で実装したもの?

いいえ。Perl 6からは大きな影響を受けていますが、Perl 6そのものではありません。MooseはあくまでもPerl 5用のオブジェクト指向システムです。スティーヴンがMooseを書いたのは、昔ながらの退屈なPerl 5のオブジェクト指向コードを書くのにうんざりしたからであり、Perl 6のオブジェクト指向システムがほしくなったから。だからこそ、Rubyに転向するかわりに、Mooseを書いたのです :)

あれ、「ポスト」モダン? ただの「モダン」だと思っていたけど。

1999年に開催された『Linux World』でラリー・ウォールは「Perl, the first postmodern computer language」というトークをしました。その中でラリーは、Perlには自分がいいと思った機能を取り入れ、だめだと思った機能は捨てたという話をしたのですが、スティーヴンはその記事を読んで、自分たちがMooseでしてきたこともまったく同じだと思ったのです。Mooseも、Perl 6やCLOS (LISP)、Smalltalk、Java、BETA、OCaml、Rubyといった多くの言語から機能を「借り」てきましたが、気に入らなかった(だめだと思った)部分については投げ捨ててきました。このような理由から(ほかにも理由はありますが)スティーヴンはMooseを「ポストモダン」なオブジェクトシステムと言い直すことにしたのです。

説明はもう十分でしょう。

作者

Dave Rolsky <autarch@urth.org>

Stevan Little <stevan@iinteractive.com>

コピーライト & ライセンス

Copyright 2008-2009 by Infinity Interactive, Inc.

http://www.iinteractive.com

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.