On 2014-01-03 14:17, Dmitry Latin wrote: >>> Yeah, but it works only with one parent. I want to subclass from 2 parent >>> classes. >> Use roles instead of multiple-inheritance, much easier to get right! >> > I would be very grateful to you if you could show me some code to make it > work. > > All my attempts to do it (using Moose roles or inheritance via 'extends') was > unsuccessful. > I looked at your github repo, some of the problems might comes because your Result namespace is nested. Put all classes directly in the Result namespace.
In our schema i have a result base class in Result::Parent::All which e.g. loads components that are used by most tables like TimeStamp. This is how it looks (the Result namespace is called Table in my schema): package NAC::Model::DBIC::Table::Parent::All; use Moose; use MooseX::NonMoose; use namespace::autoclean; extends 'DBIx::Class::Core'; __PACKAGE__->load_components( qw( IntrospectableM2M InflateColumn::IP TimeStamp ) ); __PACKAGE__->table_class( 'NAC::Model::DBIC::ResultSource::Table::Parent::All'); __PACKAGE__->table('dummy'); __PACKAGE__->resultset_class('NAC::Model::DBIC::ResultSet::Parent::All'); # disable cascade_delete by default around qw( might_have has_one has_many ) => sub { my $orig = shift; my $class = shift; # copy to avoid side effects cause by modifying the input params my @params = @_; my ( $rel, $f_class, $cond, $attrs ) = @params; $attrs ||= {}; $attrs->{cascade_delete} = 0 unless exists $attrs->{cascade_delete}; $params[3] = $attrs; $class->$orig(@params); }; # to allow subclasses use around method modifiers sub FOREIGNBUILDARGS { shift; return @_; } __PACKAGE__->meta->make_immutable; 1; Then I have a result role that adds four columns to a table: package NAC::Model::DBIC::ResultRole::Auditable; use base DBIx::Class; use Class::C3::Componentised::ApplyHooks -after_apply => sub { my ($class, $component) = @_; $class->load_components(qw( UserStamp )); $class->add_columns( "create_datetime", { data_type => "DATETIME", is_nullable => 0, timezone => "UTC", set_on_create => 1, }, "create_user", { data_type => "NUMBER", is_foreign_key => 1, is_nullable => 1, size => 6, store_user_on_create => 1, }, "update_datetime", { data_type => "DATETIME", is_nullable => 0, timezone => "UTC", set_on_create => 1, set_on_update => 1, }, "update_user", { data_type => "NUMBER", is_foreign_key => 1, is_nullable => 1, size => 6, store_user_on_create => 1, store_user_on_update => 1, }, ); $class->belongs_to( "rel_create_user", "NAC::Model::DBIC::Table::Nacuser", "create_user", { join_type => "LEFT" }, ); $class->belongs_to( "rel_update_user", "NAC::Model::DBIC::Table::Nacuser", "update_user", { join_type => "LEFT" }, ); }, qw(); 1; =head1 NAME NAC::Model::DBIC::ResultRole::Auditable - result role that adds audit columns and relationships. =cut =head1 SYNOPSIS # this has to go after ->table __PACKAGE__->load_components(qw( +NAC::Model::DBIC::ResultRole::Auditable )); =cut I don't remember why Class::C3::Componentised::ApplyHooks was necessary to make it work as I have other roles that don't require it but I think it has to do with adding relationships as well. And in one of the result classes I apply the role just after the add_columns call: __PACKAGE__->load_components(qw( +NAC::Model::DBIC::ResultRole::Auditable )); HTH *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"* T-Systems Austria GesmbH Rennweg 97-99, 1030 Wien Handelsgericht Wien, FN 79340b *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"* Notice: This e-mail contains information that is confidential and may be privileged. If you are not the intended recipient, please notify the sender and then delete this e-mail immediately. *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"* _______________________________________________ List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class IRC: irc.perl.org#dbix-class SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk