X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FBase.pm;h=e0007ffee6fa27f263f22fea8e13b2cb98400ba0;hb=83a6b24431383e560f414f2fcaefe7b8c08e03d2;hp=286825095e54f8adb0b436d030f878a3e60f6032;hpb=ee3337752d314667ec575398bb5007670db9bfbe;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/Base.pm b/lib/DBIx/Class/Relationship/Base.pm index 2868250..e0007ff 100644 --- a/lib/DBIx/Class/Relationship/Base.pm +++ b/lib/DBIx/Class/Relationship/Base.pm @@ -631,39 +631,15 @@ your storage until you call L on it. =cut sub new_related { - my ($self, $rel, $values) = @_; - - # FIXME - this is a bad position for this (also an identical copy in - # set_from_related), but I have no saner way to hook, and I absolutely - # want this to throw at least for coderefs, instead of the "insert a NULL - # when it gets hard" insanity --ribasushi - # - # sanity check - currently throw when a complex coderef rel is encountered - # FIXME - should THROW MOAR! - - my $rsrc = $self->result_source; - my $rel_info = $rsrc->relationship_info($rel) - or $self->throw_exception( "No such relationship '$rel'" ); - my (undef, $crosstable, $nonequality_foreign_columns) = $rsrc->_resolve_condition ( - $rel_info->{cond}, $rel, $self, $rel - ); - - $self->throw_exception("Relationship '$rel' does not resolve to a join-free condition fragment") - if $crosstable; - - if ( - $nonequality_foreign_columns - and - my @unspecified_rel_condition_chunks = grep { ! exists $values->{$_} } @$nonequality_foreign_columns - ) { - $self->throw_exception(sprintf ( - "Custom relationship '%s' not definitive - returns conditions instead of values for column(s): %s", - $rel, - map { "'$_'" } @unspecified_rel_condition_chunks - )); - } - - return $self->search_related($rel)->new_result($values); + my ($self, $rel, $data) = @_; + + return $self->search_related($rel)->new_result( $self->result_source->_resolve_relationship_condition ( + infer_values_based_on => $data, + rel_name => $rel, + self_resultobj => $self, + foreign_alias => $rel, + self_alias => 'me', + )->{inferred_values} ); } =head2 create_related @@ -805,37 +781,13 @@ set them in the storage. sub set_from_related { my ($self, $rel, $f_obj) = @_; - my $rsrc = $self->result_source; - my $rel_info = $rsrc->relationship_info($rel) - or $self->throw_exception( "No such relationship '$rel'" ); - - if (defined $f_obj) { - my $f_class = $rel_info->{class}; - $self->throw_exception( "Object '$f_obj' isn't a ".$f_class ) - unless blessed $f_obj and $f_obj->isa($f_class); - } - - - # FIXME - this is a bad position for this (also an identical copy in - # new_related), but I have no saner way to hook, and I absolutely - # want this to throw at least for coderefs, instead of the "insert a NULL - # when it gets hard" insanity --ribasushi - # - # sanity check - currently throw when a complex coderef rel is encountered - # FIXME - should THROW MOAR! - my ($cond, $crosstable, $nonequality_foreign_columns) = $rsrc->_resolve_condition ( - $rel_info->{cond}, $f_obj, $rel, $rel - ); - $self->throw_exception("Relationship '$rel' does not resolve to a join-free condition fragment") - if $crosstable; - - $self->throw_exception(sprintf ( - "Custom relationship '%s' not definitive - returns conditions instead of values for column(s): %s", - $rel, - map { "'$_'" } @$nonequality_foreign_columns - )) if $nonequality_foreign_columns; - - $self->set_columns($cond); + $self->set_columns( $self->result_source->_resolve_relationship_condition ( + infer_values_based_on => {}, + rel_name => $rel, + foreign_resultobj => $f_obj, + foreign_alias => $rel, + self_alias => 'me', + )->{inferred_values} ); return 1; }