throw error on failed new in run_if_script run_if_script_error
Christian Walde [Fri, 24 Oct 2014 17:36:26 +0000 (19:36 +0200)]
Changes
Makefile.PL
lib/Web/Simple/Application.pm
t/run_if_script.t

diff --git a/Changes b/Changes
index 04acb5f..1c0aa85 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,7 @@
 Revision history for Web-Simple
 
+  - throw error on failed new in run_if_script
+
 0.030 - 2014-08-07
   - make dispatch_misc.t handle Plack's MockHTTP's on error behaviour changing
 
index af92644..8c66925 100644 (file)
@@ -42,6 +42,7 @@ my %WriteMakefileArgs = (
           'Scalar::Util' => '0',        # not core in 5.6
           'Syntax::Keyword::Gather' => '1.001',
           'strictures' => '1',
+          'Try::Tiny' => '0',
           'warnings::illegalproto' => '0',
           'perl' => '5.006',
         },
index f72142a..7ef273b 100644 (file)
@@ -1,6 +1,7 @@
 package Web::Simple::Application;
 
 use Scalar::Util 'weaken';
+use Try::Tiny;
 
 use Moo;
 
@@ -49,12 +50,22 @@ sub _build_final_dispatcher {
 }
 
 sub run_if_script {
+  my ( $self ) = @_;
   # ->to_psgi_app is true for require() but also works for plackup
-  return $_[0]->to_psgi_app if caller(1);
-  my $self = ref($_[0]) ? $_[0] : $_[0]->new;
+  return $self->to_psgi_app if caller(1);
+  $self = ref($self) ? $self : $self->_build_for_run_if_script;
   $self->run(@_);
 }
 
+sub _build_for_run_if_script {
+  my ( $self ) = @_;
+  try { $self->new }
+  catch {
+    die "Failed to create new '$self' object during run_if_script"
+      . " (should your .pm file end with just '1;'?) : $_\n";
+  };
+}
+
 sub _run_cgi {
   my $self = shift;
   require Plack::Handler::CGI;
index ede9d89..dc66514 100644 (file)
@@ -1,6 +1,7 @@
 use strictures;
 
 use Test::More;
+use Test::Fatal 'exception';
 
 {
     use Web::Simple 'RunTest';
@@ -12,6 +13,14 @@ use Test::More;
     sub run              { @_, "run" }
 }
 
+{
+    use Web::Simple 'DieTest';
+
+    package DieTest;
+    use Moo;
+    has die => is => ro => required => 1;
+}
+
 is(
     sub { RunTest->run_if_script }
       ->(),
@@ -39,4 +48,10 @@ is_deeply(
     "passing arguments to run_if_script has them passed on to the run method"
 );
 
+like(
+    exception { DieTest->_build_for_run_if_script },    #
+    qr/^Failed to create new 'DieTest' object during/,
+    "object creation in run_if_script decorates failure with useful information"
+);
+
 done_testing;