The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Class::ReturnValue - A return-value object that lets you treat it as as a boolean, array or object

DESCRIPTION

Class::ReturnValue is a "clever" return value object that can allow code calling your routine to expect: a boolean value (did it fail) or a list (what are the return values)

EXAMPLE

sub demo {
    my $value = shift;
    my $ret = Class::ReturnValue->new();
    $ret->as_array('0', 'No results found');

    unless($value) {
        $ret->as_error(errno => '1',
                           message => "You didn't supply a parameter.",
                           do_backtrace => 1);
    }

    return($ret->return_value);
}

if (demo('foo')){ 
    print "the routine succeeded with one parameter";
}
if (demo()) {
    print "The routine succeeded with 0 paramters. shouldn't happen";
} else {
    print "The routine failed with 0 parameters (as it should).";
}


my $return = demo();
if ($return) {
    print "The routine succeeded with 0 paramters. shouldn't happen";
} else {
    print "The routine failed with 0 parameters (as it should). ".
          "Stack trace:\n".
    $return->backtrace;
}

my @return3 = demo('foo');
print "The routine got ".join(',',@return3).
      "when asking for demo's results as an array";


my $return2 = demo('foo');

unless ($return2) {
    print "The routine failed with a parameter. shouldn't happen.".
         "Stack trace:\n".
    $return2->backtrace;
}

my @return2_array = @{$return2}; # TODO: does this work
my @return2_array2 = $return2->as_array;

METHODS

new

Instantiate a new Class::ReturnValue object

as_array

Return the 'as_array' attribute of this object as an array.

as_array [ARRAY]

If $self is called in an array context, returns the array specified in ARRAY

as_error HASH

Turns this return-value object into an error return object. TAkes three parameters:

message
do_backtrace
errno 

'message' is a human readable error message explaining what's going on

'do_backtrace' is a boolean. If it's true, a carp-style backtrace will be 
stored in $self->{'backtrace'}. It defaults to true

errno and message default to undef. errno _must_ be specified. 
It's a numeric error number.  Any true integer value  will cause the 
object to evaluate to false in a scalar context. At first, this may look a 
bit counterintuitive, but it means that you can have error codes and still 
allow simple use of your functions in a style like this:


    if ($obj->do_something) {
        print "Yay! it worked";
    } else {
        print "Sorry. there's been an error.";
    }


    as well as more complex use like this:

    my $retval = $obj->do_something;
    
    if ($retval) {
        print "Yay. we did something\n";
        my ($foo, $bar, $baz) = @{$retval};
        my $human_readable_return = $retval;
    } else {
        if ($retval->errno == 20) {
            die "Failed with error 20 (Not enough monkeys).";
        } else {
            die  $retval->backtrace; # Die and print out a backtrace 
        }
    }
errno

Returns the errno if there's been an error. Otherwise, return undef

error_message

If there's been an error return the error message.

backtrace

If there's been an error and we asked for a backtrace, return the backtrace. Otherwise, return undef.

error_condition

If there's been an error, return undef. Otherwise return 1

AUTHOR

Jesse Vincent <jesse@bestpractical.com>

BUGS

This module has, as yet, not been used in production code. I thing
it should work, but have never benchmarked it. I have not yet used
it extensively, though I do plan to in the not-too-distant future.
If you have questions or comments,  please write me.

If you need to report a bug, please send mail to 
<bug-class-returnvalue@rt.cpan.org> or report your error on the web
at http://rt.cpan.org/

COPYRIGHT

Copyright (c) 2002,2003,2005,2007 Jesse Vincent <jesse@bestpractical.com>
You may use, modify, fold, spindle or mutilate this module under
the same terms as perl itself.

SEE ALSO

Class::ReturnValue isn't an exception handler. If it doesn't
do what you want, you might want look at one of the exception handlers
below:

Error, Exception, Exceptions, Exceptions::Class

You might also want to look at Contextual::Return, another implementation
of the same concept as this module.

3 POD Errors

The following errors were encountered while parsing the POD:

Around line 97:

'=item' outside of any '=over'

Around line 264:

=cut found outside a pod block. Skipping to next block.

Around line 296:

You forgot a '=back' before '=head1'