Moose > Moose::Cookbook::Meta::Recipe4

題名

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 <autarch@urth.org>

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

Copyright 2006-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.