1

データベースと対話するMooseロールの小さな(まもなく大きくなる)セットがあります。create_foo_record、update_foo_record、delete_foo_recordなどのメソッドがあります(データの変換と正規化、アクションのログ記録などを行うため、データベースアクセスの単純なラッパーではありません。場合によっては、関連するレコードも作成および更新することがあります。 。)

このコードはかなり一般的であるため、カットアンドペーストコードのモジュールを20個持つのではなく、テーブル、列、正規化関数などを指示する構成パラメーターを使用して、これらのメソッドを実装するベースモジュールが必要です。

私の本能は、これらの関数を生成する「高階」の何かを書くことですが、それはムースの方法で行う方が適切だと思います。(私はムースの初心者ですが...)

素朴な方法は、基本クラスをロールにすることであり、そのメソッドは構成引数を取りますが、これは厄介なようです。

理想的には、基本クラスに、それを使用するロールが設定するプライベート構成を持たせたいと思います。

__PACKAGE__->config( foo => 'bar' );

しかし、Mooseを使用してこれを行う方法がわかりません。私の試みでは、クラスをロールに拡張することについて不平を言うエラーが発生しました。または、設定パラメータがプライベートではないことが判明し、他のロールに干渉するか、ロールを使用するCatalystコントローラの対応する設定によって干渉されています。

基本クラスで「Catalyst::Component」を使用することは可能ですが、それを何らかの形でロールに拡張することができれば、それは理想的です。しかし、私はそれを行う方法を知りません、あるいはそれが可能であるとしても。

ありがとう。

4

2 に答える 2

2

これはDBIx::Class :: SchemaLoaderのようにひどく聞こえることはさておき、私があなたを正しく理解していれば、あなたは...

  • システム構成情報を保存するもの。
  • デフォルトがあります。
  • これらのデフォルトは、クラスごとにオーバーライドできます。

これを行う1つの方法は、ロールを作成し、ビルダーメソッドを利用することです。ロールはビルダーメソッドを介してデフォルトを定義し、各クラスはオーバーライドできます。

use v5.10;

{
  package MyConfig;

  use Moose::Role;

  has user => (
      is      => 'ro',
      lazy    => 1,
      builder => '_build_user',
  );

  sub _build_user {
    return "default_user";
  }
}

{
  package MyApp;
  use Moose;

  with 'MyConfig';

  sub _build_user {
    return "some_user";
  }
}

{
  package DefaultApp;
  use Moose;

  with 'MyConfig';
}

say MyApp->new->user;        # some_user
say DefaultApp->new->user;   # default_user

もう1つは、属性の継承を利用することです。

use v5.10;

{
  package MyConfig;

  use Moose::Role;

  has user =>
      is      => 'ro',
      lazy    => 1,
      default => "default_user",
  ;
}

{
  package MyApp;
  use Moose;

  with 'MyConfig';

  has '+user' =>
      default => 'some_user'
  ;
}

{
  package DefaultApp;
  use Moose;

  with 'MyConfig';
}

say MyApp->new->user;        # some_user
say DefaultApp->new->user;   # default_user

それらは基本的に同じものです。前者は、より伝統的なOOスタイルで行われ、より機械的です。後者は少しムースの魔法を使って行われ、より宣言的でコンパクトです。それぞれにマイナーな長所と短所があり、快適な方を使用してください。

于 2012-12-22T03:41:19.797 に答える
1

私が必要としているのはパラメーター化された役割だと思いますhttp://metacpan.org/pod/MooseX::Role:: Parameterized

于 2012-12-22T17:13:40.803 に答える