はじめに
前回では、フロー制御のメソッドを使用してアクションからURLを遷移することなく別アクションを呼び出す方法、そしてリダイレクトを行う方法を紹介しました。これでコントローラに関する主要な機能についての紹介を終えて、今回からはモデルに移っていきたいと思います。
ところで、Catalystの5.7から5.8にバージョンアップされた際に、内部を実装する仕組みとしてMooseが採用されました。MooseとはPerl5にオブジェクトシステムを導入するためのモジュールであり、これまでのblessを使用したPerlのオブジェクト指向プログラミングよりも簡単に、より多くのことを実現できます。
本記事では、簡単にではありますがblessとMooseを比較したPerlのオブジェクト指向プログラミングについて説明し、その後でモデルの概要を説明していきます。
対象読者
- Perlで簡単なスクリプトを作成したことのある方
- Perlのオブジェクト指向プログラミングについて初歩的な知識のある方
- Webアプリケーションの基本的な仕組み(HTTPリクエスト、レスポンスなど)についての知識のある方
これまでの連載
- 初めてのCatalyst入門(1) PerlによるWebフレームワークCatalystとは?
- 初めてのCatalyst入門(2) Catalystアプリはどのように作るのか?
- 初めてのCatalyst入門(3) 処理の入り口はアクション
- 初めてのCatalyst入門(4) URLパスとリクエストパラメータ
- 初めてのCatalyst入門(5) フロー制御とChainedアクション
必要な環境
本連載で紹介するサンプルなどで実行している環境は次の通りです。
CentOS 5.3
- Perl 5.8.9
- Catalyst 5.80013
また、動作確認を行ったWindowsの環境は次の通りです。
Windows Vista
- ActivePerl 5.8.9 Build 826
- Catalyst 5.80011
Perlのオブジェクト指向プログラミング
Perl5までは、C++やJavaのようなオブジェクトという概念は言語仕様には含まれておらず、言語の互換性を保ったまま実現するために、後付として独特な仕組みが実装されました。
この独特な仕組みでオブジェクトを作成するためにはbless
関数を使用します。Perlのオブジェクトはリファレンスであり、package
で指定される名前空間とリファレンスを結びつけるのがbless
になります。オブジェクトはリファレンスであるので、プロパティやメソッドには->
演算子を使用してアクセスします。
Foo
オブジェクトを生成し、bar
メソッドを呼び出す場合には次のように記述します。オブジェクトの生成を行うメソッド名(コンストラクタ)にはどのような名前を使用してもかまいませんが、new
という名前が慣例として使われています。
# Fooオブジェクトの生成 my $foo = Foo->new(); # barメソッドの呼び出し $foo->bar();
bless
では、名前空間とリファレンスとの関連づけを行うところまでしか面倒を見てくれないため、コンストラクタやプロパティへのアクセスメソッド、さらに読み取り専用などのアクセス権限までも含めてプログラマがいちいち記述する必要があります。これらの処理はほとんど同じ形式のため、オブジェクトが増えればそれだけ、似たようなメソッドを延々と書き続けることになります。
このような、同じことの繰り返しを避けるために、Perlではモジュールという形でさまざまなクラスの定義手法が提案されてきました。
CPANには、Class::
で始まるさまざまなクラス定義モジュールが登録されており、それぞれに特徴を持った機能を用意しています。これらの試みのなかから、メタオブジェクトプロトコル(Meta Object Protocol:MOP)を利用したMooseが登場しました。Moose
を使用することで、オブジェクト指向プログラミングをする上での煩雑な手続きを、より簡単に行うことができるようになります。
以降では、Person
クラスとそれを継承したBaseballPlayer
クラスを例として、bless
とMoose
でどのようにクラスを定義するかを紹介します。Person
にはname
とage
の2つのプロパティを持ち、age
は書き込み不可とします。BaseballPlayer
にはteam
プロパティを追加し、それぞれのクラスには自己紹介を行うintroduce
メソッドを定義します。
メタオブジェクトプロトコルとは、オブジェクトシステムに対する操作を行うためのAPIで、派生関係などのクラス情報を取得したり(イントロスペクション)、クラスやオブジェクトの振る舞いを変更する(インターセッション)APIを持ちます。
Perl5のオブジェクトシステムに対するMOPのライブラリとしては、Class::MOPが有名で、Moose
もこのClass::MOP
に対するラッパとして実装されています。