From: Christian Walde Date: Fri, 24 Oct 2014 17:36:26 +0000 (+0200) Subject: throw error on failed new in run_if_script X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FWeb-Simple.git;a=commitdiff_plain;h=7346dbd367858f693d12a0180ee391b12cc8347a throw error on failed new in run_if_script --- diff --git a/Changes b/Changes index 04acb5f..1c0aa85 100644 --- 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 diff --git a/Makefile.PL b/Makefile.PL index af92644..8c66925 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -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', }, diff --git a/lib/Web/Simple/Application.pm b/lib/Web/Simple/Application.pm index f72142a..7ef273b 100644 --- a/lib/Web/Simple/Application.pm +++ b/lib/Web/Simple/Application.pm @@ -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; diff --git a/t/run_if_script.t b/t/run_if_script.t index ede9d89..dc66514 100644 --- a/t/run_if_script.t +++ b/t/run_if_script.t @@ -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;