fixed set_$rel (from many_to_many) to accept a listref
Justin Guenther [Thu, 24 Aug 2006 17:58:38 +0000 (17:58 +0000)]
lib/DBIx/Class/Relationship/Base.pm
lib/DBIx/Class/Relationship/ManyToMany.pm

index 9797b7c..8409165 100644 (file)
@@ -410,7 +410,7 @@ B<Currently only available for C<many-to-many> relationships.>
 
 =over 4
 
-=item Arguments: (@hashrefs |  @objs)
+=item Arguments: (\@hashrefs | \@objs)
 
 =back
 
@@ -418,18 +418,22 @@ B<Currently only available for C<many-to-many> relationships.>
   my @roles = $schema->resultset('Role')->search({ role => 
      { '-in' -> ['Fred', 'Barney'] } } );
 
-  $actor->set_roles(@roles);
-     # Replaces all of $actors previous roles with the two named
+  $actor->set_roles(\@roles);
+     # Replaces all of $actor's previous roles with the two named
 
-Replace all the related objects with the given list of objects. This does a
-C<delete> B<on the link table resultset> to remove the association between the
-current object and all related objects, then calls C<add_to_$rel> repeatedly to
-link all the new objects.
+Replace all the related objects with the given reference to a list of
+objects. This does a C<delete> B<on the link table resultset> to remove the
+association between the current object and all related objects, then calls
+C<add_to_$rel> repeatedly to link all the new objects.
 
 Note that this means that this method will B<not> delete any objects in the
 table on the right side of the relation, merely that it will delete the link
 between them.
 
+Due to a mistake in the original implementation of this method, it will also
+accept a list of objects or hash references. This is B<deprecated> and will be
+removed in a future version.
+
 =head2 remove_from_$rel
 
 B<Currently only available for C<many-to-many> relationships.>
index 65eab45..09cd751 100644 (file)
@@ -60,8 +60,9 @@ sub many_to_many {
       @_ > 0 or $self->throw_exception(
         "{$set_meth} needs a list of objects or hashrefs"
       );
+      my @to_set = (ref($_[0] eq 'ARRAY') ? @{ $_[0] } : @_);
       $self->search_related($rel, {})->delete;
-      $self->$add_meth(shift) while (defined $_[0]);
+      $self->$add_meth(shift) for (@to_set);
     };
 
     *{"${class}::${remove_meth}"} = sub {