package Venus::Role::Catchable; use 5.018; use strict; use warnings; use Venus::Role 'fault'; # AUDITS sub AUDIT { my ($self, $from) = @_; if (!$from->does('Venus::Role::Tryable')) { fault "${self} requires ${from} to consume Venus::Role::Tryable"; } return $self; } # METHODS sub catch { my ($self, $method, @args) = @_; my @result = $self->try($method, @args)->error(\my $error)->result; return wantarray ? ($error ? ($error, undef) : ($error, @result)) : $error; } # EXPORTS sub EXPORT { ['catch'] } 1; =head1 NAME Venus::Role::Catchable - Catchable Role =cut =head1 ABSTRACT Catchable Role for Perl 5 =cut =head1 SYNOPSIS package Example; use Venus::Class; use Venus 'error'; with 'Venus::Role::Tryable'; with 'Venus::Role::Catchable'; sub pass { true; } sub fail { error; } package main; my $example = Example->new; # my $error = $example->catch('fail'); =cut =head1 DESCRIPTION This package modifies the consuming package and provides methods for trapping errors thrown from dispatched method calls. =cut =head1 METHODS This package provides the following methods: =cut =head2 catch catch(Str $method, Any @args) (Any) The catch method traps any errors raised by executing the dispatched method call and returns the error string or error object. This method can return a list of values in list-context. This method supports dispatching, i.e. providing a method name and arguments whose return value will be acted on by this method. I> =over 4 =item catch example 1 package main; my $example = Example->new; my $catch = $example->catch('fail'); # bless({...}, "Venus::Error") =back =over 4 =item catch example 2 package main; my $example = Example->new; my $catch = $example->catch('pass'); # undef =back =over 4 =item catch example 3 package main; my $example = Example->new; my ($catch, $result) = $example->catch('pass'); # (undef, 1) =back =over 4 =item catch example 4 package main; my $example = Example->new; my ($catch, $result) = $example->catch('fail'); # (bless({...}, "Venus::Error"), undef) =back =cut