我有一小组(很快就会很大)与数据库交互的Moose角色。它们有create_foo_record,update_foo_record,delete_foo_record等方法。(它们不是数据库访问的简单包装器,因为它们可以执行诸如转换和规范化数据,记录操作等操作。在某些情况下,它们也可以创建和更新相关记录。 。)
这段代码非常通用,所以我不想拥有二十几个剪切和粘贴代码模块,而是想要一个实现这些方法的基础模块,使用配置参数告诉它们哪些表,列,规范化函数等。
我的直觉是写一些产生这些功能的“高阶”,但我认为采用Moose方式更合适。 (我是Moose新手,但是......)
天真的方法是让基类成为一个角色,它的方法需要配置参数,但这看起来很混乱。
理想情况下,我希望基类具有私有配置,使用它的角色设置,如
__PACKAGE__->config( foo => 'bar' );
但我不确定如何使用Moose做到这一点。我的尝试有抱怨将课程扩展到角色的错误。或者配置参数不是私有的,并且干扰其他角色或者受到使用角色的Catalyst控制器中相应配置的干扰。
如果可以在基类中使用'Catalyst :: Component',但不知何故将其扩展到角色,那将是理想的。但我不知道该怎么做,或者即使有可能。
感谢。
答案 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