如何为具有可继承数据的角色编写Moose基类?

时间:2012-12-21 22:40:10

标签: perl moose

我有一小组(很快就会很大)与数据库交互的Moose角色。它们有create_foo_record,update_foo_record,delete_foo_record等方法。(它们不是数据库访问的简单包装器,因为它们可以执行诸如转换和规范化数据,记录操作等操作。在某些情况下,它们也可以创建和更新相关记录。 。)

这段代码非常通用,所以我不想拥有二十几个剪切和粘贴代码模块,而是想要一个实现这些方法的基础模块,使用配置参数告诉它们哪些表,列,规范化函数等。

我的直觉是写一些产生这些功能的“高阶”,但我认为采用Moose方式更合适。 (我是Moose新手,但是......)

天真的方法是让基类成为一个角色,它的方法需要配置参数,但这看起来很混乱。

理想情况下,我希望基类具有私有配置,使用它的角色设置,如

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

但我不确定如何使用Moose做到这一点。我的尝试有抱怨将课程扩展到角色的错误。或者配置参数不是私有的,并且干扰其他角色或者受到使用角色的Catalyst控制器中相应配置的干扰。

如果可以在基类中使用'Catalyst :: Component',但不知何故将其扩展到角色,那将是理想的。但我不知道该怎么做,或者即使有可能。

感谢。

2 个答案:

答案 0 :(得分:2)

暂且不说这听起来很像DBIx::Class::SchemaLoader,如果我理解你想要的话......

  • 存储系统配置信息的东西。
  • 它有默认值。
  • 可以按类别覆盖这些默认值。

一种方法是create a role and take advantage of builder methods。该角色通过构建器方法定义默认值,每个类都可以覆盖。

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

另一种方法是利用attribute inheritance

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风格,更具机械性。后者是使用一点Moose魔法完成的,更具说明性和紧凑性。每个都有微小的优点和缺点,使用对你来说很舒服。

答案 1 :(得分:1)

我认为我需要的是参数化角色http://metacpan.org/pod/MooseX::Role::Parameterized