Die on search in void context
Peter Rabbitson [Mon, 8 Nov 2010 01:26:47 +0000 (02:26 +0100)]
Changes
lib/DBIx/Class/ResultSet.pm
t/search/void.t [new file with mode: 0644]
t/storage/txn.t

diff --git a/Changes b/Changes
index 2acf103..58a6f70 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,8 @@ Revision history for DBIx::Class
     * New Features / Changes
         - New method ResultSource columns_info method, returning multiple
           pairs of column name/info at once
+        - $rs->search now throws when called in void context, as it makes
+          no sense (and is nearly always a sign of a bug/misdesign)
         - NULL is now supplied unquoted to all debug-objects, in order to
           differentiate between a real NULL and the string 'NULL'
 
index 474b5da..c6a68c3 100644 (file)
@@ -249,7 +249,17 @@ For more help on using joins with search, see L<DBIx::Class::Manual::Joining>.
 sub search {
   my $self = shift;
   my $rs = $self->search_rs( @_ );
-  return (wantarray ? $rs->all : $rs);
+
+  my $want = wantarray;
+  if ($want) {
+    return $rs->all;
+  }
+  elsif (defined $want) {
+    return $rs;
+  }
+  else {
+    $self->throw_exception ('->search is *not* a mutator, calling it in void context makes no sense');
+  }
 }
 
 =head2 search_rs
diff --git a/t/search/void.t b/t/search/void.t
new file mode 100644 (file)
index 0000000..95a040f
--- /dev/null
@@ -0,0 +1,16 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Exception;
+
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema(no_deploy => 1);
+
+throws_ok {
+  $schema->resultset('Artist')->search
+} qr/\Qsearch is *not* a mutator/, 'Proper exception on search in void ctx';
+
+done_testing;
index a6a5f0b..dc7c8b3 100644 (file)
@@ -18,7 +18,7 @@ my $code = sub {
     year => 2006,
   }) foreach (@cd_titles);
 
-  return $artist->cds;
+  return $artist->cds->all;
 };
 
 # Test checking of parameters