NAME

Data::Object::Try

ABSTRACT

Try Class for Perl 5

SYNOPSIS

  use strict;
  use warnings;
  use routines;

  use Data::Object::Try;

  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {
    # try something

    return time;
  });

  $try->catch('Example::Exception', fun ($caught) {
    # caught an exception

    return;
  });

  $try->default(fun ($caught) {
    # catch the uncaught

    return;
  });

  $try->finally(fun (@args) {
    # always run after try/catch

    return;
  });

  my @args;

  my $result = $try->result(@args);

DESCRIPTION

This package provides an object-oriented interface for performing complex try/catch operations.

ATTRIBUTES

This package has the following attributes:

arguments

  arguments(ArrayRef)

This attribute is read-only, accepts (ArrayRef) values, and is optional.

invocant

  invocant(Object)

This attribute is read-only, accepts (Object) values, and is optional.

on_catch

  on_catch(ArrayRef[CodeRef])

This attribute is read-write, accepts (ArrayRef[CodeRef]) values, and is optional.

on_default

  on_default(CodeRef)

This attribute is read-write, accepts (CodeRef) values, and is optional.

on_finally

  on_finally(CodeRef)

This attribute is read-write, accepts (CodeRef) values, and is optional.

on_try

  on_try(CodeRef)

This attribute is read-write, accepts (CodeRef) values, and is optional.

METHODS

This package implements the following methods:

call

  call(Str | CodeRef $arg) : Object

The call method takes a method name or coderef, registers it as the tryable routine, and returns the object. When invoked, the callback will received an invocant if one was provided to the constructor, the default arguments if any were provided to the constructor, and whatever arguments were provided by the invocant.

call example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    return [@args];
  });

callback

  callback(Str | CodeRef $arg) : CodeRef

The callback method takes a method name or coderef, and returns a coderef for registration. If a coderef is provided this method is mostly a passthrough.

callback example #1
  my $try = Data::Object::Try->new;

  $try->callback(fun (@args) {

    return [@args];
  });
callback example #2
  package Example;

  use Moo;

  fun test(@args) {

    return [@args];
  }

  package main;

  my $try = Data::Object::Try->new(
    invocant => Example->new
  );

  $try->callback('test');

catch

  catch(Str $isa, Str | CodeRef $arg) : Any

The catch method takes a package or ref name, and when triggered checks whether the captured exception is of the type specified and if so executes the given callback.

catch example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    die $try;
  });

  $try->catch('Data::Object::Try', fun (@args) {

    return [@args];
  });

default

  default(Str | CodeRef $arg) : Object

The default method takes a method name or coderef and is triggered if no catch conditions match the exception thrown.

default example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    die $try;
  });

  $try->default(fun (@args) {

    return [@args];
  });

execute

  execute(CodeRef $arg, Any @args) : Any

The execute method takes a coderef and executes it with any given arguments. When invoked, the callback will received an invocant if one was provided to the constructor, the default arguments if any were provided to the constructor, and whatever arguments were passed directly to this method.

execute example #1
  my $try = Data::Object::Try->new(
    invocant => Example->new,
    arguments => [1,2,3]
  );

  $try->execute(fun (@args) {

    return [@args];
  });

finally

  finally(Str | CodeRef $arg) : Object

The finally method takes a package or ref name and always executes the callback after a try/catch operation. The return value is ignored. When invoked, the callback will received an invocant if one was provided to the constructor, the default arguments if any were provided to the constructor, and whatever arguments were provided by the invocant.

finally example #1
  my $try = Data::Object::Try->new(
    invocant => Example->new,
    arguments => [1,2,3]
  );

  $try->call(fun (@args) {

    return $try;
  });

  $try->finally(fun (@args) {

    $try->{'$finally'} = [@args];
  });

maybe

  maybe() : Object

The maybe method registers a default catch condition that returns falsy, i.e. an empty string, if an exception is encountered.

maybe example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    die $try;
  });

  $try->maybe;

no_catch

  no_catch() : Object

The no_catch method removes any configured catch conditions and returns the object.

no_catch example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    die $try;
  });

  $try->catch('Data::Object::Try', fun (@args) {

    return [@args];
  });

  $try->no_catch;

no_default

  no_default() : Object

The no_default method removes any configured default condition and returns the object.

no_default example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    die $try;
  });

  $try->default(fun (@args) {

    return [@args];
  });

  $try->no_default;

no_finally

  no_finally() : Object

The no_finally method removes any configured finally condition and returns the object.

no_finally example #1
  my $try = Data::Object::Try->new(
    invocant => Example->new,
    arguments => [1,2,3]
  );

  $try->call(fun (@args) {

    return $try;
  });

  $try->finally(fun (@args) {

    $try->{'$finally'} = [@args];
  });

  $try->no_finally;

no_try

  no_try() : Object

The no_try method removes any configured try operation and returns the object.

no_try example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    return [@args];
  });

  $try->no_try;

result

  result(Any @args) : Any

The result method executes the try/catch/default/finally logic and returns either 1) the return value from the successfully tried operation 2) the return value from the successfully matched catch condition if an exception was thrown 3) the return value from the default catch condition if an exception was thrown and no catch condition matched. When invoked, the try and finally callbacks will received an invocant if one was provided to the constructor, the default arguments if any were provided to the constructor, and whatever arguments were passed directly to this method.

result example #1
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    return [@args];
  });

  $try->result;
result example #2
  my $try = Data::Object::Try->new;

  $try->call(fun (@args) {

    return [@args];
  });

  $try->result(1..5);

AUTHOR

Al Newkirk, awncorp@cpan.org

LICENSE

Copyright (C) 2011-2019, Al Newkirk, et al.

This is free software; you can redistribute it and/or modify it under the terms of the The Apache License, Version 2.0, as elucidated in the "license file".

PROJECT

Wiki

Project

Initiatives

Milestones

Contributing

Issues