Изменить дерево наследования классов DBIx Class Result? - PullRequest
4 голосов
/ 24 июня 2011

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_moose и result_base_class при создании результирующих классов.

РЕДАКТИРОВАТЬ: Найдено решение. Посмотрите, как DBIx :: Class :: Schema :: Loader делает это теперь , имеют изменяемые и неизменяемые классы результатов.

1 Ответ

1 голос
/ 26 ноября 2011

Если вы просто хотите добавить несколько методов и т. Д. В родительский класс, ваш код должен работать.Возможно, вам потребуется 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 для автоматической генерации этого кода.

...