Moose > Moose::Cookbook::Extending::Recipe4

題名

Moose::Cookbook::Extending::Recipe4 - Moose.pmのようにMoose風のシュガー関数を提供する

概要

  package MyApp::Mooseish;

  use Moose ();
  use Moose::Exporter;

  Moose::Exporter->setup_import_methods(
      with_meta => ['has_table'],
      also      => 'Moose',
  );

  sub init_meta {
      shift;
      return Moose->init_meta( @_, metaclass => 'MyApp::Meta::Class' );
  }

  sub has_table {
      my $meta = shift;
      $meta->table(shift);
  }

  package MyApp::Meta::Class;
  use Moose;

  extends 'Moose::Meta::Class';

  has 'table' => ( is => 'rw' );

本文

このレシピではMoose::Cookbook::Extending::Recipe1で見たMoose::Exporterの使い方を拡張して、自前のオブジェクトベースクラスを用意するかわりに、自前のメタクラスのクラスを用意して、has_tableというシュガー関数をエクスポートします。

上記のコードを用意すれば、use Mooseはすべてuse MyApp::Mooseishで置き換えることができます。同様に、no Mooseno MyApp::Mooseishで置き換えられます。

with_metaパラメータには、エクスポートする前にラップしておきたい関数のリストを指定します。ラッパが保証するのは、関数の第1引数がインポートするパッケージのメタオブジェクトになることだけです(だから、my $meta = shift;とできます)。

Moose::ExporterのAPIについてはMoose::Exporterのドキュメントをご覧ください。

MyApp::Mooseishを使う

ここまで見てきたコードの目的は、Mooseのようなインタフェースを提供することでした。実際にはこのような使い方をします。

  package MyApp::User;

  use MyApp::Mooseish;

  has_table 'User';

  has 'username' => ( is => 'ro' );
  has 'password' => ( is => 'ro' );

  sub login { ... }

  no MyApp::Mooseish;

use MyApp::Mooseishすれば、通常のMooseのシュガー関数(has()with()など)もすべて利用できます。

まとめ

拡張モジュールにシュガー関数を用意すると、よりMooseっぽく見えるようになります。拡張モジュールの例としては、Fey::ORMをご覧ください。

作者

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.