]> Dogcows Code - chaz/p5-DBIx-Class-ResultSet-RecursiveUpdate/blobdiff - lib/DBIx/Class/ResultSet/RecursiveUpdate.pm
rename $related_result -> $related_resultset
[chaz/p5-DBIx-Class-ResultSet-RecursiveUpdate] / lib / DBIx / Class / ResultSet / RecursiveUpdate.pm
index 1438959cd5c237c87addab57bea33d51b43887c5..04685e7a63fbad39516c80ed236291dd3bc58c21 100644 (file)
@@ -114,7 +114,7 @@ sub recursive_update {
     }
     for my $name ( keys %pre_updates ) {
         my $info = $object->result_source->relationship_info($name);
-        _update_relation( $self, $name, $updates, $object, $info,
+        _update_relation( $self, $name, $updates->{$name}, $object, $info,
             $if_not_submitted );
     }
 
@@ -162,7 +162,7 @@ sub recursive_update {
     }
     for my $name ( keys %post_updates ) {
         my $info = $object->result_source->relationship_info($name);
-        _update_relation( $self, $name, $updates, $object, $info,
+        _update_relation( $self, $name, $updates->{$name}, $object, $info,
             $if_not_submitted );
     }
     return $object;
@@ -181,9 +181,12 @@ sub _get_columns_by_accessor {
     return %columns;
 }
 
+# Arguments: $name, $updates, $object, $info, $if_not_submitted
+
 sub _update_relation {
     my ( $self, $name, $updates, $object, $info, $if_not_submitted ) = @_;
-    my $related_result =
+    # get a related resultset without a condition
+    my $related_resultset =
         $self->related_resultset($name)->result_source->resultset;
     my $resolved;
     if ( $self->result_source->can('_resolve_condition') ) {
@@ -197,22 +200,24 @@ sub _update_relation {
             $object );
     }
 
-    # warn 'resolved: ' . Dumper( $resolved ); use Data::Dumper;
+    # warn "$name resolved: " . Dumper( $resolved ); use Data::Dumper;
     $resolved = {}
         if defined $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION
             && $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION
             == $resolved;
-    if ( ref $updates->{$name} eq 'ARRAY' ) {
+
+    # an arrayref is only valid for has_many rels
+    if ( ref $updates eq 'ARRAY' ) {
         my @updated_ids;
-        for my $sub_updates ( @{ $updates->{$name} } ) {
+        for my $sub_updates ( @{$updates} ) {
             my $sub_object = recursive_update(
-                resultset => $related_result,
+                resultset => $related_resultset,
                 updates   => $sub_updates,
                 resolved  => $resolved
             );
             push @updated_ids, $sub_object->id;
         }
-        my @related_pks = $related_result->result_source->primary_columns;
+        my @related_pks = $related_resultset->result_source->primary_columns;
         if ( defined $if_not_submitted && $if_not_submitted eq 'delete' ) {
 
             # only handles related result classes with single primary keys
@@ -236,32 +241,31 @@ sub _update_relation {
         }
     }
     else {
-        my $sub_updates = $updates->{$name};
         my $sub_object;
-        if ( ref $sub_updates ) {
+        if ( ref $updates ) {
 
             # for might_have relationship
             if ( $info->{attrs}{accessor} eq 'single'
                 && defined $object->$name )
             {
                 $sub_object = recursive_update(
-                    resultset => $related_result,
-                    updates   => $sub_updates,
+                    resultset => $related_resultset,
+                    updates   => $updates,
                     object    => $object->$name
                 );
             }
             else {
                 $sub_object = recursive_update(
-                    resultset => $related_result,
-                    updates   => $sub_updates,
+                    resultset => $related_resultset,
+                    updates   => $updates,
                     resolved  => $resolved
                 );
             }
         }
-        elsif ( !ref $sub_updates ) {
-            $sub_object = $related_result->find($sub_updates)
+        elsif ( !ref $updates ) {
+            $sub_object = $related_resultset->find($updates)
                 unless (
-                !$sub_updates
+                !$updates
                 && ( exists $info->{attrs}{join_type}
                     && $info->{attrs}{join_type} eq 'LEFT' )
                 );
@@ -269,7 +273,7 @@ sub _update_relation {
         $object->set_from_related( $name, $sub_object )
             unless (
                !$sub_object
-            && !$sub_updates
+            && !$updates
             && ( exists $info->{attrs}{join_type}
                 && $info->{attrs}{join_type} eq 'LEFT' )
             );
@@ -578,15 +582,16 @@ Clearing the relationship:
 =head2 Treatment of many-to-many pseudo relations
 
 The function gets the information about m2m relations from DBIx::Class::IntrospectableM2M.
-If it is not loaded in the ResultSource classes - then the code relies on the fact that:
+If it isn't loaded in the ResultSource classes the code relies on the fact that:
+
     if($object->can($name) and
              !$object->result_source->has_relationship($name) and
              $object->can( 'set_' . $name )
          )
 
-then $name must be a many to many pseudo relation.  And that in a
-similarly ugly was I find out what is the ResultSource of objects from
-that many to many pseudo relation.
+Then $name must be a many to many pseudo relation.
+And that in a similarly ugly was I find out what is the ResultSource of
+objects from that many to many pseudo relation.
 
 
 =head1 INTERFACE 
This page took 0.020054 seconds and 4 git commands to generate.