clean up code a bit more
Matt S Trout [Wed, 3 Jun 2009 20:08:36 +0000 (21:08 +0100)]
lib/DBIx/Class/ResultSource/MultipleTableInheritance.pm
t/01load.t

index f27eab6..77cfded 100644 (file)
@@ -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};
index a913536..4dfc3f1 100644 (file)
@@ -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;