更改DBIx类结果类的继承树?

时间:2011-06-24 06:07:01

标签: perl dbix-class

G'Day,

我正在使用DBIx :: Class 0.07003和DBIx :: Class :: Schema :: Loader 0.03009,我正在尝试更改Loader生成的类的基类 - 来自:

package S2S::DBIxperiment::Productions;

# Created by DBIx::Class::Schema::Loader v0.03009 @ 2011-06-24 14:29:13

use base 'DBIx::Class';

__PACKAGE__->load_components("PK::Auto", "Core");

类似于:

package S2S::DBIxperiment::Productions;

# Created by DBIx::Class::Schema::Loader v0.03009 @ 2011-06-24 14:29:13

use base 'BaseMooseDBI';

__PACKAGE__->load_components("PK::Auto", "Core");

BaseMooseDBI的样子:

package BaseMooseDBI;

use Moose;

use base qw(DBIx::Class);

但是,这似乎根本不起作用,它似乎没有继承BaseMooseDBI包中的内容(属性等)我尝试覆盖load_components中的BaseMooseDBI同样,但它永远不会被调用 - 而是它找不到load_components的错误?

似乎有什么问题?

注意:生成结果类时,我无法使用较新的use_mooseresult_base_class

编辑:找到解决方案。看看DBIx :: Class :: Schema :: Loader如何现在,拥有Mutable和Immutable结果类。

1 个答案:

答案 0 :(得分:1)

如果您只想向父类添加一些方法等,您的代码应该可以正常工作。您可能需要use MooseX::NonMoose,过去我已经使用了父子类DBIx::Class::Core而不是DBIx::Class。以下是我成功使用的内容:

# Parent
package App::Schema::Result;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'DBIx::Class::Core';
sub parent_method { ... }

# Child
package App::Schema::Result::Product;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'Keystone::Schema::Site::Result';
__PACKAGE__->table('products');

sub child_method {
   my ($self) = @_;
   $self->parent_method();
}

如果您希望父类定义DBIx::Class具体信息(即致电__PACKAGE->table__PACKAGE__->add_columns等),请查看DBIx::Class::Helper::Row::SubClass。使用它,您可以像普通DBIx::Class::Result::*一样定义父类,在子类中使用SubClass组件并调用subclass

# Parent
package App::Schema::Result::Parent;
use Moose;
use MooseX::NonMoose;
extends 'DBIx::Class';
__PACKAGE__->load_components(qw{InflateColumn::DateTime Core});
__PACKAGE__->table('products');
...
# Child
package App::Schema::Result::Child;
use Moose;
use MooseX::NonMoose;
extends 'App::Schema::Result::Parent';
__PACKAGE__->load_components(qw{Helper::Row::SubClass Core});
__PACKAGE__->subclass;
# Now add the child specific stuff / override parent stuff

我不确定您是否可以Loader自动生成部分代码。