From: Matt S Trout Date: Wed, 3 Jun 2009 20:08:36 +0000 (+0100) Subject: clean up code a bit more X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class-ResultSource-MultipleTableInheritance.git;a=commitdiff_plain;h=4d88a8d74d868ae912ba87f158e854ee76b8a372 clean up code a bit more --- diff --git a/lib/DBIx/Class/ResultSource/MultipleTableInheritance.pm b/lib/DBIx/Class/ResultSource/MultipleTableInheritance.pm index f27eab6..77cfded 100644 --- a/lib/DBIx/Class/ResultSource/MultipleTableInheritance.pm +++ b/lib/DBIx/Class/ResultSource/MultipleTableInheritance.pm @@ -48,13 +48,15 @@ method schema (@args) { } method _attach_additional_sources () { - my $raw_name = $self->_raw_source_name; + my $raw_name = $self->raw_source_name; my $schema = $self->schema; # if the raw source is already present we can assume we're done return if grep { $_ eq $raw_name } $schema->sources; + # our parent should've been registered already actually due to DBIC # attaching subclass sources later in load_namespaces + my $parent; if ($self->parent_source) { my $parent_name = $self->parent_source->name; @@ -64,14 +66,14 @@ method _attach_additional_sources () { confess "Couldn't find attached source for parent $parent_name - did you use load_classes? This module is only compatible with load_namespaces" unless $parent; } - my $table = Table->new({ name => '_'.$self->name }); - $table->add_columns( - map { ($_ => { %{$self->column_info($_)} }) } - grep { $self->column_info($_)->{originally_defined_in} eq $self->name } - $self->columns - ); + + # create the raw table source + + my $table = Table->new({ name => $self->raw_table_name }); + # we don't need to add the PK cols explicitly if we're the root table - # since they already got added above + # since they'll get added below + if ($parent) { my %join; foreach my $pri ($self->primary_columns) { @@ -80,8 +82,18 @@ method _attach_additional_sources () { $table->add_column($pri => \%info); $join{"foreign.${pri}"} = "self.${pri}"; } - $table->add_relationship('parent', $parent->source_name, \%join); + # have to use source name lookups rather than result class here + # because we don't actually have a result class on the raw sources + $table->add_relationship('parent', $parent->raw_source_name, \%join); } + + # add every column that's actually a concrete part of us + + $table->add_columns( + map { ($_ => { %{$self->column_info($_)} }) } + grep { $self->column_info($_)->{originally_defined_in} eq $self->name } + $self->columns + ); $table->set_primary_key($self->primary_columns); $schema->register_source($raw_name => $table); } @@ -93,13 +105,17 @@ method set_primary_key (@args) { return $self->next::method(@args); } -method _raw_source_name () { +method raw_source_name () { my $base = $self->source_name; confess "Can't generate raw source name when we don't have a source_name" unless $base; return 'Raw::'.$base; } +method raw_table_name () { + return '_'.$self->name; +} + method add_columns (@args) { my $ret = $self->next::method(@args); $_->{originally_defined_in} ||= $self->name for values %{$self->_columns}; diff --git a/t/01load.t b/t/01load.t index a913536..4dfc3f1 100644 --- a/t/01load.t +++ b/t/01load.t @@ -16,4 +16,22 @@ is_deeply( 'Columns for raw foo ok' ); -warn Dumper $raw_foo->_columns; +my $raw_bar = MTITest->source('Raw::Bar'); + +is_deeply( + [ $raw_bar->columns ], + [ qw(id b) ], +); + +ok($raw_bar->has_relationship('parent'), 'parent rel exists'); + +my $parent_info = $raw_bar->relationship_info('parent'); + +is( + $parent_info->{source}, 'Raw::Foo', + 'parent rel points to raw parent' +); + +warn Dumper $raw_bar->_columns; + +warn Dumper $raw_bar->_relationships;