=encoding utf8 =pod =head1 題名 Moose::Cookbook::Meta::Recipe5 - メタクラスのトレートとしての「table」アトリビュート =head1 概要 package MyApp::Meta::Class::Trait::HasTable; use Moose::Role; has table => ( is => 'rw', isa => 'Str', ); package Moose::Meta::Class::Custom::Trait::HasTable; sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' } package MyApp::User; use Moose -traits => 'HasTable'; __PACKAGE__->meta->table('User'); =head1 本文 このレシピでは、Lで説明したtableというメタクラスアトリビュートをメタクラスのトレートとして実装します。トレートはLでも見たように単なるロールに過ぎません。 トレートを利用する利点は、複数のトレートの合成が簡単にできることです。メタクラスのサブクラスを複数合成する場合、さらにもうひとつサブクラスを作る必要がありますが、トレートの場合は、メタクラスに組み込む部分はMooseが面倒を見てくれます。 =head2 実際にメタクラスのトレートを利用してみる このトレートをメタクラスに組み込んでしまえば、見た目はLで見た例とまったく同じになります。 my $table = MyApp::User->meta->table; # the safe version $table = MyApp::User->meta->table if MyApp::User->meta->meta->can('does') and MyApp::User->meta->meta->does('MyApp::Meta::Class'); 安全なバージョンは少し複雑です。メタクラスオブジェクトのメタクラスにCメソッドがあるかを確認しなければなりません。Cメソッドがあれば、メタクラスに特定のロールが組み込まれているか確認できます。 もっと簡単に、こう書くこともできます。 $table = MyApp::User->meta->table if MyApp::User->meta->can('table'); 理屈の上ではこちらはやや不正確です。メタクラスは「別の」ロールからCメソッドをもらっている可能性がありますので。ただし、実用上、その手の問題に行き当たることはまずないでしょう。 =head1 参照 L - アトリビュートのトレートを利用したラベルの実装 L - メタクラスに「table」アトリビュートを追加する =head1 作者 Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE Copyright 2006-2009 by Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =pod