Explicit return added
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class / ResultSource.pm
index 954e8da..343c019 100644 (file)
@@ -7,6 +7,7 @@ use DBIx::Class::ResultSet;
 use Carp::Clan qw/^DBIx::Class/;
 
 use Storable;
+use Scalar::Util qw/weaken/;
 
 use base qw/DBIx::Class/;
 __PACKAGE__->load_components(qw/AccessorGroup/);
@@ -33,7 +34,7 @@ retrieved, most usually a table (see L<DBIx::Class::ResultSource::Table>)
 sub new {
   my ($class, $attrs) = @_;
   $class = ref $class if ref $class;
-  my $new = bless({ %{$attrs || {}} }, $class);
+  my $new = bless({ %{$attrs || {}}, _resultset => undef }, $class);
   $new->{resultset_class} ||= 'DBIx::Class::ResultSet';
   $new->{resultset_attributes} = { %{$new->{resultset_attributes} || {}} };
   $new->{_ordered_columns} = [ @{$new->{_ordered_columns}||[]}];
@@ -158,7 +159,7 @@ sub has_column {
   return exists $self->_columns->{$column};
 }
 
-=head2 column_info 
+=head2 column_info
 
   my $info = $obj->column_info($col);
 
@@ -206,7 +207,9 @@ sub columns {
   return @{$self->{_ordered_columns}||[]};
 }
 
-=head2 set_primary_key(@cols)
+=head2 set_primary_key
+
+=head3 Arguments: (@cols)
 
 Defines one or more columns as primary key for this source. Should be
 called after C<add_columns>.
@@ -244,7 +247,7 @@ sub primary_columns {
 
 Declare a unique constraint on this source. Call once for each unique
 constraint. Unique constraints are used when you call C<find> on a
-L<DBIx::Class::ResultSet, only columns in the constraint are searched,
+L<DBIx::Class::ResultSet>, only columns in the constraint are searched,
 
   # For e.g. UNIQUE (column1, column2)
   __PACKAGE__->add_unique_constraint(constraint_name => [ qw/column1 column2/ ]);
@@ -388,7 +391,7 @@ sub add_relationship {
   1;
 }
 
-=head2 relationships()
+=head2 relationships
 
 Returns all valid relationship names for this source
 
@@ -398,7 +401,9 @@ sub relationships {
   return keys %{shift->_relationships};
 }
 
-=head2 relationship_info($relname)
+=head2 relationship_info
+
+=head3 Arguments: ($relname)
 
 Returns the relationship information for the specified relationship name
 
@@ -409,7 +414,9 @@ sub relationship_info {
   return $self->_relationships->{$rel};
 } 
 
-=head2 has_relationship($rel)
+=head2 has_relationship
+
+=head3 Arguments: ($rel)
 
 Returns 1 if the source has a relationship of this name, 0 otherwise.
 
@@ -420,7 +427,9 @@ sub has_relationship {
   return exists $self->_relationships->{$rel};
 }
 
-=head2 resolve_join($relation)
+=head2 resolve_join
+
+=head3 Arguments: ($relation)
 
 Returns the join structure required for the related result source
 
@@ -453,7 +462,9 @@ sub resolve_join {
   }
 }
 
-=head2 resolve_condition($cond, $as, $alias|$object)
+=head2 resolve_condition
+
+=head3 Arguments: ($cond, $as, $alias|$object)
 
 Resolves the passed condition to a concrete query fragment. If given an alias,
 returns a join condition; if given an object, inverts that object to produce
@@ -474,6 +485,8 @@ sub resolve_condition {
         #warn "$self $k $for $v";
         $ret{$k} = $for->get_column($v);
         #warn %ret;
+      } elsif (ref $as) { # reverse object
+        $ret{$v} = $as->get_column($k);
       } else {
         $ret{"${as}.${k}"} = "${for}.${v}";
       }
@@ -486,7 +499,9 @@ sub resolve_condition {
   }
 }
 
-=head2 resolve_prefetch (hashref/arrayref/scalar)
+=head2 resolve_prefetch
+
+=head3 Arguments: (hashref/arrayref/scalar)
 
 Accepts one or more relationships for the current source and returns an
 array of column names for each of those relationships. Column names are
@@ -564,7 +579,9 @@ sub resolve_prefetch {
   }
 }
 
-=head2 related_source($relname)
+=head2 related_source
+
+=head3 Arguments: ($relname)
 
 Returns the result source object for the given relationship
 
@@ -598,7 +615,12 @@ Specify here any attributes you wish to pass to your specialised resultset.
 
 sub resultset {
   my $self = shift;
-  return $self->resultset_class->new($self, $self->{resultset_attributes});
+  return $self->{_resultset} if ref $self->{_resultset} eq $self->resultset_class;
+  return $self->{_resultset} = do {
+    my $rs = $self->resultset_class->new($self, $self->{resultset_attributes});
+    weaken $rs->result_source;
+    $rs;
+  };
 }
 
 =head2 throw_exception