2011-06-24 30 views
4

G'Day,更改DBIx類結果類的繼承樹?

我正在使用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_componentsBaseMooseDBI以及但它永遠不會被調用 - 而是它的錯誤它找不到load_components

什麼似乎是問題?

注意:生成結果類時,我不能使用較新的use_mooseresult_base_class

編輯:找到解決方案。查看DBIx :: Class :: Schema :: Loader如何執行它現在,具有可變和不可變結果類。

回答

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

# 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自動生成一些這段代碼。