pod typo fix
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / Base.pm
index b662a23..b10c687 100644 (file)
@@ -51,7 +51,7 @@ command immediately before C<JOIN>.
 An arrayref containing a list of accessors in the foreign class to proxy in
 the main class. If, for example, you do the following:
   
-  __PACKAGE__->might_have(bar => 'Bar', undef, { proxy => qw[/ margle /] });
+  __PACKAGE__->might_have(bar => 'Bar', undef, { proxy => [ qw/margle/ ] });
   
 Then, assuming Bar has an accessor named margle, you can do:
 
@@ -69,8 +69,14 @@ created, which calls C<create_related> for the relationship.
 
 =back
 
+=head2 register_relationship($relname, $rel_info)
+
+Registers a relationship on the class
+
 =cut
 
+sub register_relationship { }
+
 =head2 search_related
 
   My::Table->search_related('relname', $cond, $attrs);
@@ -86,13 +92,29 @@ sub search_related {
     $attrs = { %{ pop(@_) } };
   }
   my $rel_obj = $self->relationship_info($rel);
-  $self->throw( "No such relationship ${rel}" ) unless $rel_obj;
+  $self->throw_exception( "No such relationship ${rel}" ) unless $rel_obj;
   $attrs = { %{$rel_obj->{attrs} || {}}, %{$attrs || {}} };
 
-  $self->throw( "Invalid query: @_" ) if (@_ > 1 && (@_ % 2 == 1));
+  $self->throw_exception( "Invalid query: @_" ) if (@_ > 1 && (@_ % 2 == 1));
   my $query = ((@_ > 1) ? {@_} : shift);
 
   my ($cond) = $self->result_source->resolve_condition($rel_obj->{cond}, $rel, $self);
+  if (ref $cond eq 'ARRAY') {
+    $cond = [ map { my %hash;
+      foreach my $key (keys %{$_}) {
+        unless ($key =~ m/\./) {
+          $hash{"me.$key"} = $_->{$key};
+        } else {
+          $hash{$key} = $_->{$key};
+        }
+      }; \%hash; } @$cond ];
+  } else {
+    foreach my $key (keys %$cond) {
+      unless ($key =~ m/\./) {
+        $cond->{"me.$key"} = delete $cond->{$key};
+      }
+    }
+  }
   $query = ($query ? { '-and' => [ $cond, $query ] } : $cond);
   #use Data::Dumper; warn Dumper($cond);
   #warn $rel_obj->{class}." $meth $cond ".join(', ', @{$attrs->{bind}||[]});
@@ -102,7 +124,7 @@ sub search_related {
 
 =head2 count_related
 
-  My::Table->count_related('relname', $cond, $attrs);
+  $obj->count_related('relname', $cond, $attrs);
 
 =cut
 
@@ -166,20 +188,20 @@ sub find_or_create_related {
 sub set_from_related {
   my ($self, $rel, $f_obj) = @_;
   my $rel_obj = $self->relationship_info($rel);
-  $self->throw( "No such relationship ${rel}" ) unless $rel_obj;
+  $self->throw_exception( "No such relationship ${rel}" ) unless $rel_obj;
   my $cond = $rel_obj->{cond};
-  $self->throw( "set_from_related can only handle a hash condition; the "
+  $self->throw_exception( "set_from_related can only handle a hash condition; the "
     ."condition for $rel is of type ".(ref $cond ? ref $cond : 'plain scalar'))
       unless ref $cond eq 'HASH';
   my $f_class = $self->result_source->schema->class($rel_obj->{class});
-  $self->throw( "Object $f_obj isn't a ".$f_class )
+  $self->throw_exception( "Object $f_obj isn't a ".$f_class )
     unless $f_obj->isa($f_class);
   foreach my $key (keys %$cond) {
     next if ref $cond->{$key}; # Skip literals and complex conditions
-    $self->throw("set_from_related can't handle $key as key")
+    $self->throw_exception("set_from_related can't handle $key as key")
       unless $key =~ m/^foreign\.([^\.]+)$/;
     my $val = $f_obj->get_column($1);
-    $self->throw("set_from_related can't handle ".$cond->{$key}." as value")
+    $self->throw_exception("set_from_related can't handle ".$cond->{$key}." as value")
       unless $cond->{$key} =~ m/^self\.([^\.]+)$/;
     $self->set_column($1 => $val);
   }