題名¶
Moose::Cookbook::Meta::Recipe4 - メタクラスに「table」アトリビュートを追加する
概要¶
package MyApp::Meta::Class;
use Moose;
extends 'Moose::Meta::Class';
has table => (
is => 'rw',
isa => 'Str',
);
本文¶
このレシピでは「table」アトリビュートを持つ新しいメタクラスを作成します。このメタクラスはORMを作るときのように、DBMSのテーブルに紐づけられたクラスに使うためのものです。
この例ではテーブル名は単なる文字列ですが、本当のORMであればそのテーブルを表すオブジェクトが入るかもしれません。
メタクラス¶
これは"SYNOPSIS"にある通り本当に簡単なレシピですが、自分のクラスにこのメタクラスを使わせるのと、テーブルを宣言するためのシュガー関数を用意するのにこつがいります。これについてはMoose::Cookbook::Extending::Recipe2で扱います(そちらではモジュールをMoose.pm
自身のようにする方法や、has_table()
のようなシュガー関数を用意する方法を紹介しています)。
実際にこのメタクラスを使ってみる¶
この新しいtable
アトリビュートにアクセスする方法はきわめて簡単。MyApp::User
という名前のクラスがあるとしたら、このように書くだけです。
my $table = MyApp::User->meta->table;
MyApp::User
がメタクラスにMyApp::Meta::Class
を使うようになっている限り、このメソッド呼び出しはうまくいきます。もっと慎重にいきたいのであれば、メタクラスのクラスをチェックすることもできます。
$table = MyApp::User->meta->table
if MyApp::User->meta->isa('MyApp::Meta::Class');
まとめ¶
独自のメタクラスを作るのはむずかしいことではありません。独自のメタクラスを使うのはもう少し大変ですが、それについてはほかのレシピで取り上げます。また、これからクラスのメタクラスにトレートを組み込む話もしていきます。こちらはさらに柔軟で相性のよい実装になります。
参照¶
Moose::Cookbook::Meta::Recipe5 - 「table」アトリビュートをメタクラスのトレートとして実装する
Moose::Cookbook::Extending::Recipe4 - Moose.pmのようにMoose風のシュガー関数を提供する
作者¶
Dave Rolsky <[email protected]>
コピーライト & ライセンス¶
Copyright 2006-2009 by Infinity Interactive, Inc.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.