Hello community, here is the log from the commit of package perl-Role-Tiny for openSUSE:Factory checked in at 2014-11-13 09:17:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Role-Tiny (Old) and /work/SRC/openSUSE:Factory/.perl-Role-Tiny.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Role-Tiny" Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Role-Tiny/perl-Role-Tiny.changes 2014-07-28 16:21:09.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.perl-Role-Tiny.new/perl-Role-Tiny.changes 2014-11-13 09:18:15.000000000 +0100 @@ -1,0 +2,6 @@ +Wed Nov 12 09:38:14 UTC 2014 - [email protected] + +- updated to 1.003004 + - allow does_role to be overridden by Moo::Role + +------------------------------------------------------------------- Old: ---- Role-Tiny-1.003003.tar.gz New: ---- Role-Tiny-1.003004.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Role-Tiny.spec ++++++ --- /var/tmp/diff_new_pack.cWbvgK/_old 2014-11-13 09:18:16.000000000 +0100 +++ /var/tmp/diff_new_pack.cWbvgK/_new 2014-11-13 09:18:16.000000000 +0100 @@ -17,7 +17,7 @@ Name: perl-Role-Tiny -Version: 1.003003 +Version: 1.003004 Release: 0 %define cpan_name Role-Tiny Summary: Roles. Like a nouvelle cuisine portion size slice of Moose. @@ -39,7 +39,6 @@ %prep %setup -q -n %{cpan_name}-%{version} -find . -type f -print0 | xargs -0 chmod 644 %build %{__perl} Makefile.PL INSTALLDIRS=vendor ++++++ Role-Tiny-1.003003.tar.gz -> Role-Tiny-1.003004.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/Changes new/Role-Tiny-1.003004/Changes --- old/Role-Tiny-1.003003/Changes 2014-03-15 21:47:13.000000000 +0100 +++ new/Role-Tiny-1.003004/Changes 2014-10-22 18:02:07.000000000 +0200 @@ -1,5 +1,8 @@ Revision history for Role-Tiny +1.003004 - 2014-10-22 + - allow does_role to be overridden by Moo::Role + 1.003003 - 2014-03-15 - overloads specified as method names rather than subrefs are now applied properly diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/MANIFEST new/Role-Tiny-1.003004/MANIFEST --- old/Role-Tiny-1.003003/MANIFEST 2014-03-15 21:47:24.000000000 +0100 +++ new/Role-Tiny-1.003004/MANIFEST 2014-10-22 18:02:22.000000000 +0200 @@ -1,7 +1,6 @@ Changes lib/Role/Tiny.pm lib/Role/Tiny/With.pm -maint/bump-version maint/Makefile.PL.include Makefile.PL MANIFEST This list of files @@ -26,9 +25,7 @@ t/role-basic-exceptions.t t/role-basic/lib/My/Does/Basic.pm t/role-basic/lib/My/Example.pm -t/role-basic/lib/MyTests.pm t/role-basic/lib/TestMethods.pm -t/role-basic/lib/Try/Tiny.pm t/role-duplication.t t/role-long-package-name.t t/role-tiny-composition.t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/META.json new/Role-Tiny-1.003004/META.json --- old/Role-Tiny-1.003003/META.json 2014-03-15 21:47:24.000000000 +0100 +++ new/Role-Tiny-1.003004/META.json 2014-10-22 18:02:21.000000000 +0200 @@ -4,7 +4,7 @@ "mst - Matt S. Trout (cpan:MSTROUT) <[email protected]>" ], "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 6.9, CPAN::Meta::Converter version 2.140640", + "generated_by" : "ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.142690", "license" : [ "perl_5" ], @@ -20,12 +20,8 @@ ] }, "prereqs" : { - "build" : { - "requires" : {} - }, - "configure" : { - "requires" : {} - }, + "build" : {}, + "configure" : {}, "develop" : { "recommends" : { "Moo" : "0", @@ -59,10 +55,10 @@ ], "repository" : { "type" : "git", - "url" : "git://git.shadowcat.co.uk/gitmo/Role-Tiny.git", - "web" : "http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Role-Tiny.git" + "url" : "git://github.com/moose/Role-Tiny.git", + "web" : "https://github.com/moose/Role-Tiny" }, "x_IRC" : "irc://irc.perl.org/#moose" }, - "version" : "1.003003" + "version" : "1.003004" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/META.yml new/Role-Tiny-1.003004/META.yml --- old/Role-Tiny-1.003003/META.yml 2014-03-15 21:47:24.000000000 +0100 +++ new/Role-Tiny-1.003004/META.yml 2014-10-22 18:02:21.000000000 +0200 @@ -5,9 +5,8 @@ build_requires: Test::Fatal: '0.003' Test::More: '0.96' -configure_requires: {} dynamic_config: 1 -generated_by: 'ExtUtils::MakeMaker version 6.9, CPAN::Meta::Converter version 2.140640' +generated_by: 'ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.142690' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -26,5 +25,5 @@ IRC: irc://irc.perl.org/#moose bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Role-Tiny license: http://dev.perl.org/licenses/ - repository: git://git.shadowcat.co.uk/gitmo/Role-Tiny.git -version: '1.003003' + repository: git://github.com/moose/Role-Tiny.git +version: '1.003004' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/Makefile.PL new/Role-Tiny-1.003004/Makefile.PL --- old/Role-Tiny-1.003003/Makefile.PL 2014-03-14 09:14:37.000000000 +0100 +++ new/Role-Tiny-1.003004/Makefile.PL 2014-08-21 17:42:13.000000000 +0200 @@ -4,35 +4,29 @@ my %META = ( name => 'Role-Tiny', - license => 'perl_5', prereqs => { - configure => { requires => { - } }, - build => { requires => { - } }, test => { requires => { - 'Test::More' => 0.96, - 'Test::Fatal' => 0.003, + 'Test::More' => '0.96', + 'Test::Fatal' => '0.003', } }, runtime => { requires => { - perl => 5.006, - Exporter => '5.57', + 'perl' => '5.006', + 'Exporter' => '5.57', }, recommends => { - 'Class::Method::Modifiers' => 1.05, + 'Class::Method::Modifiers' => '1.05', }, }, develop => { recommends => { 'namespace::clean' => 0, - Moo => 0, + 'Moo' => 0, } }, }, resources => { - # r/w: [email protected]:Role-Tiny.git repository => { - url => 'git://git.shadowcat.co.uk/gitmo/Role-Tiny.git', - web => 'http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Role-Tiny.git', + url => 'git://github.com/moose/Role-Tiny.git', + web => 'https://github.com/moose/Role-Tiny', type => 'git', }, bugtracker => { @@ -50,10 +44,10 @@ my %MM_ARGS = ( PREREQ_PM => { ($] >= 5.010 ? () : ('MRO::Compat' => 0)), - } + }, ); -############################################################################## +## BOILERPLATE ############################################################### require ExtUtils::MakeMaker; (do 'maint/Makefile.PL.include' or die $@) unless -f 'META.yml'; @@ -64,8 +58,10 @@ ($MM_ARGS{NAME} = $META{name}) =~ s/-/::/g; ($MM_ARGS{VERSION_FROM} = "lib/$MM_ARGS{NAME}.pm") =~ s{::}{/}g; -$MM_ARGS{LICENSE} = $META{license} - if $eumm_version >= 6.30; +$META{license} = [ $META{license} ] + if $META{license} && !ref $META{license}; +$MM_ARGS{LICENSE} = $META{license}[0] + if $META{license} && $eumm_version >= 6.30; $MM_ARGS{NO_MYMETA} = 1 if $mymeta_broken; $MM_ARGS{META_ADD} = { 'meta-spec' => { version => 2 }, %META } @@ -74,7 +70,7 @@ for (qw(configure build test runtime)) { my $key = $_ eq 'runtime' ? 'PREREQ_PM' : uc $_.'_REQUIRES'; my $r = $MM_ARGS{$key} = { - %{$META{prereqs}{$_}{requires}}, + %{$META{prereqs}{$_}{requires} || {}}, %{delete $MM_ARGS{$key} || {}}, }; defined $r->{$_} or delete $r->{$_} for keys %$r; @@ -92,3 +88,4 @@ if $eumm_version < 6.51_03; ExtUtils::MakeMaker::WriteMakefile(%MM_ARGS); +## END BOILERPLATE ########################################################### diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/lib/Role/Tiny/With.pm new/Role-Tiny-1.003004/lib/Role/Tiny/With.pm --- old/Role-Tiny-1.003003/lib/Role/Tiny/With.pm 2014-03-15 21:46:47.000000000 +0100 +++ new/Role-Tiny-1.003004/lib/Role/Tiny/With.pm 2014-10-22 18:01:41.000000000 +0200 @@ -3,7 +3,7 @@ use strict; use warnings FATAL => 'all'; -our $VERSION = '1.003003'; +our $VERSION = '1.003004'; $VERSION = eval $VERSION; use Role::Tiny (); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/lib/Role/Tiny.pm new/Role-Tiny-1.003004/lib/Role/Tiny.pm --- old/Role-Tiny-1.003003/lib/Role/Tiny.pm 2014-03-15 21:43:55.000000000 +0100 +++ new/Role-Tiny-1.003004/lib/Role/Tiny.pm 2014-10-22 18:01:41.000000000 +0200 @@ -6,7 +6,7 @@ use strict; use warnings FATAL => 'all'; -our $VERSION = '1.003003'; +our $VERSION = '1.003004'; $VERSION = eval $VERSION; our %INFO; @@ -368,8 +368,8 @@ # and &overload::nil in the code slot. next unless $i =~ /^\(/ - && defined &overload::nil - && $methods->{$i} == \&overload::nil; + && ((defined &overload::nil && $methods->{$i} == \&overload::nil) + || (defined &overload::_nil && $methods->{$i} == \&overload::_nil)); my $overload = ${ *{_getglob "${role}::${i}"}{SCALAR} }; next @@ -414,8 +414,9 @@ # only add does() method to classes return if $me->is_role($to); + my $does = $me->can('does_role'); # add does() only if they don't have one - *{_getglob "${to}::does"} = \&does_role unless $to->can('does'); + *{_getglob "${to}::does"} = $does unless $to->can('does'); return if $to->can('DOES') and $to->can('DOES') != (UNIVERSAL->can('DOES') || 0); @@ -423,7 +424,7 @@ my $existing = $to->can('DOES') || $to->can('isa') || $FALLBACK; my $new_sub = sub { my ($proto, $role) = @_; - Role::Tiny::does_role($proto, $role) or $proto->$existing($role); + $proto->$does($role) or $proto->$existing($role); }; no warnings 'redefine'; *{_getglob "${to}::DOES"} = $new_sub; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/maint/bump-version new/Role-Tiny-1.003004/maint/bump-version --- old/Role-Tiny-1.003003/maint/bump-version 2014-03-14 09:14:37.000000000 +0100 +++ new/Role-Tiny-1.003004/maint/bump-version 1970-01-01 01:00:00.000000000 +0100 @@ -1,46 +0,0 @@ -#!/usr/bin/env perl - -use strict; -use warnings FATAL => 'all'; -use autodie; - -chomp(my $LATEST = qx(grep '^[0-9]' Changes | head -1 | awk '{print \$1}')); - -my @parts = split /\./, $LATEST; -if (@parts == 2) { - @parts[1,2] = $parts[1] =~ /(\d{1,3})(\d{1,3})/; -} - -my $OLD_DECIMAL = sprintf('%i.%03i%03i', @parts); - -my %bump_part = (major => 0, minor => 1, bugfix => 2); - -my $bump_this = $bump_part{$ARGV[0]||'bugfix'}; - -die "no idea which part to bump - $ARGV[0] means nothing to me" - unless defined($bump_this); - -my @new_parts = @parts; - -$new_parts[$bump_this]++; -$new_parts[$_] = 0 for ($bump_this+1 .. 2); - -my $NEW_DECIMAL = sprintf('%i.%03i%03i', @new_parts); - -warn "Bumping $OLD_DECIMAL -> $NEW_DECIMAL\n"; - -for my $PM_FILE (qw( - lib/Moo.pm - lib/Moo/Role.pm - lib/Sub/Defer.pm - lib/Sub/Quote.pm -)) { - my $file = do { local (@ARGV, $/) = ($PM_FILE); <> }; - - $file =~ s/(?<=\$VERSION = ')${\quotemeta $OLD_DECIMAL}/${NEW_DECIMAL}/ - or die "unable to bump version number in $PM_FILE"; - - open my $out, '>', $PM_FILE; - - print $out $file; -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/around-does.t new/Role-Tiny-1.003004/t/around-does.t --- old/Role-Tiny-1.003003/t/around-does.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/around-does.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,3 +1,5 @@ +use strict; +use warnings FATAL => 'all'; use Test::More; BEGIN { @@ -9,24 +11,24 @@ my $pass2; BEGIN { - package Local::Role; - use Role::Tiny; - around does => sub { - my ($orig, $self, @args) = @_; - $pass++; - return $self->$orig(@args); - }; - around DOES => sub { - my ($orig, $self, @args) = @_; - $pass2++; - return $self->$orig(@args); - }; + package Local::Role; + use Role::Tiny; + around does => sub { + my ($orig, $self, @args) = @_; + $pass++; + return $self->$orig(@args); + }; + around DOES => sub { + my ($orig, $self, @args) = @_; + $pass2++; + return $self->$orig(@args); + }; } BEGIN { - package Local::Class; - use Role::Tiny::With; - with 'Local::Role'; + package Local::Class; + use Role::Tiny::With; + with 'Local::Role'; } ok(Local::Class->does('Local::Role')); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/does.t new/Role-Tiny-1.003004/t/does.t --- old/Role-Tiny-1.003003/t/does.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/does.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,3 +1,5 @@ +use strict; +use warnings FATAL => 'all'; use Test::More tests => 14; BEGIN { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/method-conflicts.t new/Role-Tiny-1.003004/t/method-conflicts.t --- old/Role-Tiny-1.003003/t/method-conflicts.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/method-conflicts.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,5 +1,5 @@ use strict; -use warnings; +use warnings FATAL => 'all'; use Test::More; @@ -51,4 +51,4 @@ "... which works properly", ); -done_testing; \ No newline at end of file +done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/modifiers.t new/Role-Tiny-1.003004/t/modifiers.t --- old/Role-Tiny-1.003003/t/modifiers.t 2014-03-14 09:14:37.000000000 +0100 +++ new/Role-Tiny-1.003004/t/modifiers.t 2014-04-29 06:24:19.000000000 +0200 @@ -75,4 +75,3 @@ }, 'exception caught creating class with broken modifier in a role'); done_testing; - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/namespace-clean.t new/Role-Tiny-1.003004/t/namespace-clean.t --- old/Role-Tiny-1.003003/t/namespace-clean.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/namespace-clean.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,3 +1,5 @@ +use strict; +use warnings FATAL => 'all'; use Test::More; BEGIN { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-basic/lib/MyTests.pm new/Role-Tiny-1.003004/t/role-basic/lib/MyTests.pm --- old/Role-Tiny-1.003003/t/role-basic/lib/MyTests.pm 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/role-basic/lib/MyTests.pm 1970-01-01 01:00:00.000000000 +0100 @@ -1,42 +0,0 @@ -package MyTests; - -use strict; -use warnings; - -use Test::More (); -use Try::Tiny; - -sub import { - my $class = shift; - my $caller = caller; - - no strict 'refs'; - *{"${caller}::exception"} = \&exception; - local $" = ", "; - use Data::Dumper; - $Data::Dumper::Terse = 1; - @_ = Dumper(@_); - eval <<" END"; - package $caller; - no strict; - use Test::More @_; - END - die $@ if $@; -} - -sub exception (&) { - my ($code) = @_; - - return try { - $code->(); - return undef; - } - catch { - return $_ if $_; - - my $problem = defined $_ ? 'false' : 'undef'; - Carp::confess("$problem exception caught by Test::Fatal::exception"); - }; -} - -1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-basic/lib/Try/Tiny.pm new/Role-Tiny-1.003004/t/role-basic/lib/Try/Tiny.pm --- old/Role-Tiny-1.003003/t/role-basic/lib/Try/Tiny.pm 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/role-basic/lib/Try/Tiny.pm 1970-01-01 01:00:00.000000000 +0100 @@ -1,575 +0,0 @@ -# PAUSE doesn't seem to case about this in t/role-basic/lib, but just in case ... -package # Hide from PAUSE - Try::Tiny; - -use strict; -#use warnings; - -use vars qw(@EXPORT @EXPORT_OK $VERSION @ISA); - -BEGIN { - require Exporter; - @ISA = qw(Exporter); -} - -$VERSION = "0.09"; - -$VERSION = eval $VERSION; - -@EXPORT = @EXPORT_OK = qw(try catch finally); - -$Carp::Internal{+__PACKAGE__}++; - -# Need to prototype as @ not $$ because of the way Perl evaluates the prototype. -# Keeping it at $$ means you only ever get 1 sub because we need to eval in a list -# context & not a scalar one - -sub try (&;@) { - my ( $try, @code_refs ) = @_; - - # we need to save this here, the eval block will be in scalar context due - # to $failed - my $wantarray = wantarray; - - my ( $catch, @finally ); - - # find labeled blocks in the argument list. - # catch and finally tag the blocks by blessing a scalar reference to them. - foreach my $code_ref (@code_refs) { - next unless $code_ref; - - my $ref = ref($code_ref); - - if ( $ref eq 'Try::Tiny::Catch' ) { - $catch = ${$code_ref}; - } elsif ( $ref eq 'Try::Tiny::Finally' ) { - push @finally, ${$code_ref}; - } else { - use Carp; - confess("Unknown code ref type given '${ref}'. Check your usage & try again"); - } - } - - # save the value of $@ so we can set $@ back to it in the beginning of the eval - my $prev_error = $@; - - my ( @ret, $error, $failed ); - - # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's - # not perfect, but we could provide a list of additional errors for - # $catch->(); - - { - # localize $@ to prevent clobbering of previous value by a successful - # eval. - local $@; - - # failed will be true if the eval dies, because 1 will not be returned - # from the eval body - $failed = not eval { - $@ = $prev_error; - - # evaluate the try block in the correct context - if ( $wantarray ) { - @ret = $try->(); - } elsif ( defined $wantarray ) { - $ret[0] = $try->(); - } else { - $try->(); - }; - - return 1; # properly set $fail to false - }; - - # copy $@ to $error; when we leave this scope, local $@ will revert $@ - # back to its previous value - $error = $@; - } - - # set up a scope guard to invoke the finally block at the end - my @guards = - map { Try::Tiny::ScopeGuard->_new($_, $failed ? $error : ()) } - @finally; - - # at this point $failed contains a true value if the eval died, even if some - # destructor overwrote $@ as the eval was unwinding. - if ( $failed ) { - # if we got an error, invoke the catch block. - if ( $catch ) { - # This works like given($error), but is backwards compatible and - # sets $_ in the dynamic scope for the body of C<$catch> - for ($error) { - return $catch->($error); - } - - # in case when() was used without an explicit return, the C<for> - # loop will be aborted and there's no useful return value - } - - return; - } else { - # no failure, $@ is back to what it was, everything is fine - return $wantarray ? @ret : $ret[0]; - } -} - -sub catch (&;@) { - my ( $block, @rest ) = @_; - - return ( - bless(\$block, 'Try::Tiny::Catch'), - @rest, - ); -} - -sub finally (&;@) { - my ( $block, @rest ) = @_; - - return ( - bless(\$block, 'Try::Tiny::Finally'), - @rest, - ); -} - -{ - package # hide from PAUSE - Try::Tiny::ScopeGuard; - - sub _new { - shift; - bless [ @_ ]; - } - - sub DESTROY { - my @guts = @{ shift() }; - my $code = shift @guts; - $code->(@guts); - } -} - -__PACKAGE__ - -__END__ - -=pod - -=head1 NAME - -Try::Tiny - minimal try/catch with proper localization of $@ - -=head1 SYNOPSIS - - # handle errors with a catch handler - try { - die "foo"; - } catch { - warn "caught error: $_"; # not $@ - }; - - # just silence errors - try { - die "foo"; - }; - -=head1 DESCRIPTION - -This module provides bare bones C<try>/C<catch>/C<finally> statements that are designed to -minimize common mistakes with eval blocks, and NOTHING else. - -This is unlike L<TryCatch> which provides a nice syntax and avoids adding -another call stack layer, and supports calling C<return> from the try block to -return from the parent subroutine. These extra features come at a cost of a few -dependencies, namely L<Devel::Declare> and L<Scope::Upper> which are -occasionally problematic, and the additional catch filtering uses L<Moose> -type constraints which may not be desirable either. - -The main focus of this module is to provide simple and reliable error handling -for those having a hard time installing L<TryCatch>, but who still want to -write correct C<eval> blocks without 5 lines of boilerplate each time. - -It's designed to work as correctly as possible in light of the various -pathological edge cases (see L<BACKGROUND>) and to be compatible with any style -of error values (simple strings, references, objects, overloaded objects, etc). - -If the try block dies, it returns the value of the last statement executed in -the catch block, if there is one. Otherwise, it returns C<undef> in scalar -context or the empty list in list context. The following two examples both -assign C<"bar"> to C<$x>. - - my $x = try { die "foo" } catch { "bar" }; - - my $x = eval { die "foo" } || "bar"; - -You can add finally blocks making the following true. - - my $x; - try { die 'foo' } finally { $x = 'bar' }; - try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' }; - -Finally blocks are always executed making them suitable for cleanup code -which cannot be handled using local. You can add as many finally blocks to a -given try block as you like. - -=head1 EXPORTS - -All functions are exported by default using L<Exporter>. - -If you need to rename the C<try>, C<catch> or C<finally> keyword consider using -L<Sub::Import> to get L<Sub::Exporter>'s flexibility. - -=over 4 - -=item try (&;@) - -Takes one mandatory try subroutine, an optional catch subroutine & finally -subroutine. - -The mandatory subroutine is evaluated in the context of an C<eval> block. - -If no error occurred the value from the first block is returned, preserving -list/scalar context. - -If there was an error and the second subroutine was given it will be invoked -with the error in C<$_> (localized) and as that block's first and only -argument. - -C<$@> does B<not> contain the error. Inside the C<catch> block it has the same -value it had before the C<try> block was executed. - -Note that the error may be false, but if that happens the C<catch> block will -still be invoked. - -Once all execution is finished then the finally block if given will execute. - -=item catch (&;$) - -Intended to be used in the second argument position of C<try>. - -Returns a reference to the subroutine it was given but blessed as -C<Try::Tiny::Catch> which allows try to decode correctly what to do -with this code reference. - - catch { ... } - -Inside the catch block the caught error is stored in C<$_>, while previous -value of C<$@> is still available for use. This value may or may not be -meaningful depending on what happened before the C<try>, but it might be a good -idea to preserve it in an error stack. - -For code that captures C<$@> when throwing new errors (i.e. -L<Class::Throwable>), you'll need to do: - - local $@ = $_; - -=item finally (&;$) - - try { ... } - catch { ... } - finally { ... }; - -Or - - try { ... } - finally { ... }; - -Or even - - try { ... } - finally { ... } - catch { ... }; - -Intended to be the second or third element of C<try>. Finally blocks are always -executed in the event of a successful C<try> or if C<catch> is run. This allows -you to locate cleanup code which cannot be done via C<local()> e.g. closing a file -handle. - -When invoked, the finally block is passed the error that was caught. If no -error was caught, it is passed nothing. In other words, the following code -does just what you would expect: - - try { - die_sometimes(); - } catch { - # ...code run in case of error - } finally { - if (@_) { - print "The try block died with: @_\n"; - } else { - print "The try block ran without error.\n"; - } - }; - -B<You must always do your own error handling in the finally block>. C<Try::Tiny> will -not do anything about handling possible errors coming from code located in these -blocks. - -In the same way C<catch()> blesses the code reference this subroutine does the same -except it bless them as C<Try::Tiny::Finally>. - -=back - -=head1 BACKGROUND - -There are a number of issues with C<eval>. - -=head2 Clobbering $@ - -When you run an eval block and it succeeds, C<$@> will be cleared, potentially -clobbering an error that is currently being caught. - -This causes action at a distance, clearing previous errors your caller may have -not yet handled. - -C<$@> must be properly localized before invoking C<eval> in order to avoid this -issue. - -More specifically, C<$@> is clobbered at the beginning of the C<eval>, which -also makes it impossible to capture the previous error before you die (for -instance when making exception objects with error stacks). - -For this reason C<try> will actually set C<$@> to its previous value (before -the localization) in the beginning of the C<eval> block. - -=head2 Localizing $@ silently masks errors - -Inside an eval block C<die> behaves sort of like: - - sub die { - $@ = $_[0]; - return_undef_from_eval(); - } - -This means that if you were polite and localized C<$@> you can't die in that -scope, or your error will be discarded (printing "Something's wrong" instead). - -The workaround is very ugly: - - my $error = do { - local $@; - eval { ... }; - $@; - }; - - ... - die $error; - -=head2 $@ might not be a true value - -This code is wrong: - - if ( $@ ) { - ... - } - -because due to the previous caveats it may have been unset. - -C<$@> could also be an overloaded error object that evaluates to false, but -that's asking for trouble anyway. - -The classic failure mode is: - - sub Object::DESTROY { - eval { ... } - } - - eval { - my $obj = Object->new; - - die "foo"; - }; - - if ( $@ ) { - - } - -In this case since C<Object::DESTROY> is not localizing C<$@> but still uses -C<eval>, it will set C<$@> to C<"">. - -The destructor is called when the stack is unwound, after C<die> sets C<$@> to -C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has -been cleared by C<eval> in the destructor. - -The workaround for this is even uglier than the previous ones. Even though we -can't save the value of C<$@> from code that doesn't localize, we can at least -be sure the eval was aborted due to an error: - - my $failed = not eval { - ... - - return 1; - }; - -This is because an C<eval> that caught a C<die> will always return a false -value. - -=head1 SHINY SYNTAX - -Using Perl 5.10 you can use L<perlsyn/"Switch statements">. - -The C<catch> block is invoked in a topicalizer context (like a C<given> block), -but note that you can't return a useful value from C<catch> using the C<when> -blocks without an explicit C<return>. - -This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to -concisely match errors: - - try { - require Foo; - } catch { - when (/^Can't locate .*?\.pm in \@INC/) { } # ignore - default { die $_ } - }; - -=head1 CAVEATS - -=over 4 - -=item * - -C<@_> is not available within the C<try> block, so you need to copy your -arglist. In case you want to work with argument values directly via C<@_> -aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference: - - sub foo { - my ( $self, @args ) = @_; - try { $self->bar(@args) } - } - -or - - sub bar_in_place { - my $self = shift; - my $args = \@_; - try { $_ = $self->bar($_) for @$args } - } - -=item * - -C<return> returns from the C<try> block, not from the parent sub (note that -this is also how C<eval> works, but not how L<TryCatch> works): - - sub bar { - try { return "foo" }; - return "baz"; - } - - say bar(); # "baz" - -=item * - -C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp> -will not report this when using full stack traces, though, because -C<%Carp::Internal> is used. This lack of magic is considered a feature. - -=item * - -The value of C<$_> in the C<catch> block is not guaranteed to be the value of -the exception thrown (C<$@>) in the C<try> block. There is no safe way to -ensure this, since C<eval> may be used unhygenically in destructors. The only -guarantee is that the C<catch> will be called if an exception is thrown. - -=item * - -The return value of the C<catch> block is not ignored, so if testing the result -of the expression for truth on success, be sure to return a false value from -the C<catch> block: - - my $obj = try { - MightFail->new; - } catch { - ... - - return; # avoid returning a true value; - }; - - return unless $obj; - -=item * - -C<$SIG{__DIE__}> is still in effect. - -Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of -C<eval> blocks, since it isn't people have grown to rely on it. Therefore in -the interests of compatibility, C<try> does not disable C<$SIG{__DIE__}> for -the scope of the error throwing code. - -=item * - -Lexical C<$_> may override the one set by C<catch>. - -For example Perl 5.10's C<given> form uses a lexical C<$_>, creating some -confusing behavior: - - given ($foo) { - when (...) { - try { - ... - } catch { - warn $_; # will print $foo, not the error - warn $_[0]; # instead, get the error like this - } - } - } - -=back - -=head1 SEE ALSO - -=over 4 - -=item L<TryCatch> - -Much more feature complete, more convenient semantics, but at the cost of -implementation complexity. - -=item L<autodie> - -Automatic error throwing for builtin functions and more. Also designed to -work well with C<given>/C<when>. - -=item L<Throwable> - -A lightweight role for rolling your own exception classes. - -=item L<Error> - -Exception object implementation with a C<try> statement. Does not localize -C<$@>. - -=item L<Exception::Class::TryCatch> - -Provides a C<catch> statement, but properly calling C<eval> is your -responsibility. - -The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the -issues with C<$@>, but you still need to localize to prevent clobbering. - -=back - -=head1 LIGHTNING TALK - -I gave a lightning talk about this module, you can see the slides (Firefox -only): - -L<http://nothingmuch.woobling.org/talks/takahashi.xul?data=yapc_asia_2009/try_tiny.txt> - -Or read the source: - -L<http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml> - -=head1 VERSION CONTROL - -L<http://github.com/nothingmuch/try-tiny/> - -=head1 AUTHOR - -Yuval Kogman E<lt>[email protected]<gt> - -=head1 COPYRIGHT - - Copyright (c) 2009 Yuval Kogman. All rights reserved. - This program is free software; you can redistribute - it and/or modify it under the terms of the MIT license. - -=cut - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-basic-basic.t new/Role-Tiny-1.003004/t/role-basic-basic.t --- old/Role-Tiny-1.003003/t/role-basic-basic.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/role-basic-basic.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,5 +1,7 @@ +use strict; +use warnings FATAL => 'all'; use Test::More tests => 3; -use lib 'lib', 't/role-basic/lib'; +use lib 't/role-basic/lib'; use_ok 'My::Example' or BAIL_OUT 'Could not load test module My::Example'; can_ok 'My::Example', 'no_conflict'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-basic-bugs.t new/Role-Tiny-1.003004/t/role-basic-bugs.t --- old/Role-Tiny-1.003003/t/role-basic-bugs.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/role-basic-bugs.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,5 +1,8 @@ -use lib 'lib', 't/role-basic/lib', 't/lib'; -use MyTests; +use strict; +use warnings FATAL => 'all'; +use lib 't/role-basic/lib', 't/lib'; +use Test::More; +use Test::Fatal; # multiple roles with the same role { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-basic-composition.t new/Role-Tiny-1.003004/t/role-basic-composition.t --- old/Role-Tiny-1.003003/t/role-basic-composition.t 2014-01-13 19:23:45.000000000 +0100 +++ new/Role-Tiny-1.003004/t/role-basic-composition.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,5 +1,7 @@ -use lib 'lib', 't/role-basic/lib'; -use MyTests; +use strict; +use warnings FATAL => 'all'; +use lib 't/role-basic/lib'; +use Test::More; require Role::Tiny; { @@ -122,83 +124,83 @@ } { - { - package Method::Role1; - use Role::Tiny; - sub method1 { } - requires 'method2'; - } - - { - package Method::Role2; - use Role::Tiny; - sub method2 { } - requires 'method1'; - } - my $success = eval q{ - package Class; - use Role::Tiny::With; - with 'Method::Role1', 'Method::Role2'; - 1; - }; - is $success, 1, 'composed mutually dependent methods successfully' or diag "Error: $@"; + { + package Method::Role1; + use Role::Tiny; + sub method1 { } + requires 'method2'; + } + + { + package Method::Role2; + use Role::Tiny; + sub method2 { } + requires 'method1'; + } + my $success = eval q{ + package Class; + use Role::Tiny::With; + with 'Method::Role1', 'Method::Role2'; + 1; + }; + is $success, 1, 'composed mutually dependent methods successfully' or diag "Error: $@"; } SKIP: { skip "Class::Method::Modifiers not installed or too old", 1 unless eval "use Class::Method::Modifiers 1.05; 1"; - { - package Modifier::Role1; - use Role::Tiny; - sub foo { - } - before 'bar', sub {}; - } - - { - package Modifier::Role2; - use Role::Tiny; - sub bar { - } - before 'foo', sub {}; - } - my $success = eval q{ - package Class; - use Role::Tiny::With; - with 'Modifier::Role1', 'Modifier::Role2'; - 1; - }; - is $success, 1, 'composed mutually dependent modifiers successfully' or diag "Error: $@"; + { + package Modifier::Role1; + use Role::Tiny; + sub foo { + } + before 'bar', sub {}; + } + + { + package Modifier::Role2; + use Role::Tiny; + sub bar { + } + before 'foo', sub {}; + } + my $success = eval q{ + package Class; + use Role::Tiny::With; + with 'Modifier::Role1', 'Modifier::Role2'; + 1; + }; + is $success, 1, 'composed mutually dependent modifiers successfully' or diag "Error: $@"; } { - { - package Base::Role; - use Role::Tiny; - requires qw/method1 method2/; - } - - { - package Sub::Role1; - use Role::Tiny; - with 'Base::Role'; - sub method1 {} - } - - { - package Sub::Role2; - use Role::Tiny; - with 'Base::Role'; - sub method2 {} - } - - my $success = eval q{ - package Diamant::Class; - use Role::Tiny::With; - with qw/Sub::Role1 Sub::Role2/; - 1; - }; - is $success, 1, 'composed diamantly dependent roles successfully' or diag "Error: $@"; + { + package Base::Role; + use Role::Tiny; + requires qw/method1 method2/; + } + + { + package Sub::Role1; + use Role::Tiny; + with 'Base::Role'; + sub method1 {} + } + + { + package Sub::Role2; + use Role::Tiny; + with 'Base::Role'; + sub method2 {} + } + + my $success = eval q{ + package Diamant::Class; + use Role::Tiny::With; + with qw/Sub::Role1 Sub::Role2/; + 1; + }; + is $success, 1, 'composed diamantly dependent roles successfully' or diag "Error: $@"; } { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-basic-exceptions.t new/Role-Tiny-1.003004/t/role-basic-exceptions.t --- old/Role-Tiny-1.003003/t/role-basic-exceptions.t 2013-09-18 08:11:35.000000000 +0200 +++ new/Role-Tiny-1.003004/t/role-basic-exceptions.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,5 +1,7 @@ -use lib 'lib', 't/role-basic/lib'; -use MyTests; +use strict; +use warnings FATAL => 'all'; +use lib 't/role-basic/lib'; +use Test::More; require Role::Tiny; { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-long-package-name.t new/Role-Tiny-1.003004/t/role-long-package-name.t --- old/Role-Tiny-1.003003/t/role-long-package-name.t 2014-02-24 01:10:08.000000000 +0100 +++ new/Role-Tiny-1.003004/t/role-long-package-name.t 2014-04-29 06:24:20.000000000 +0200 @@ -1,5 +1,5 @@ use strict; -use warnings; +use warnings FATAL => 'all'; use Test::More; # using Role::Tiny->apply_roles_to_object with too many roles, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003003/t/role-tiny.t new/Role-Tiny-1.003004/t/role-tiny.t --- old/Role-Tiny-1.003003/t/role-tiny.t 2014-03-04 11:02:11.000000000 +0100 +++ new/Role-Tiny-1.003004/t/role-tiny.t 2014-04-29 06:24:19.000000000 +0200 @@ -97,4 +97,3 @@ done_testing; - -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
