Contextual::Call - call sub with caller's context


Contextual-Call documentation Contained in the Contextual-Call distribution.

Index


Code Index:

NAME

Top

Contextual::Call - call sub with caller's context

VERSION

Top

Version 0.01

SYNOPSIS

Top

 use Contextual::Call qw(ccall);

 # invoke sub with your context.
 my $cc = ccall($coderef);

 ... some processes ..

 # and return value which was returned by $coderef and 
 # is matched with context.
 return $cc->result;

DESCRIPTION

Top

ccall function can invoke a function undef specified context (default is caller's context) and reproduce return value of that invocation.

This function is useful when you will override a method which returns different values between scalar and list context.

EXPORT

Top

This module can export ccall function.

FUNCTIONS

Top

ccall

 $cc = ccall($coderef);

Call specified code-ref with your context, and return a Contextual::Call object which contains result of that call. You can get the result appropriate for context.

This function is shortcut to new constructor.

CONSTRUCTOR

Top

new

 $obj = Contextual::Call->new({ context => wantarray, sub => $coderef });

Call specified code-ref with your context, and return a Contextual::Call object. This method is OO-style of ccall function.

METHODS

Top

result

 return $obj->result();

Return result value with same context with ccall/new.

AUTHOR

Top

YAMASHINA Hio, <hio at cpan.org>

BUGS

Top

Please report any bugs or feature requests to bug-contextual-call at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Contextual-Call. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

You can find documentation for this module with the perldoc command.



    perldoc Contextual::Call

You can also look for information at:

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Contextual-Call

* CPAN Ratings

http://cpanratings.perl.org/d/Contextual-Call

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Contextual-Call

* Search CPAN

http://search.cpan.org/dist/Contextual-Call

ACKNOWLEDGEMENTS

Top

COPYRIGHT & LICENSE

Top


Contextual-Call documentation Contained in the Contextual-Call distribution.

## ----------------------------------------------------------------------------
#  Contextual::Call
# -----------------------------------------------------------------------------
# Mastering programmed by YAMASHINA Hio
#
# Copyright 2007 YAMASHINA Hio
# -----------------------------------------------------------------------------
# $Id$
# -----------------------------------------------------------------------------
package Contextual::Call;
use strict;
use warnings;
use base qw(Exporter);

our @EXPORT_OK = qw(ccall);
our %EXPORT_TAGS = ( all => \@EXPORT_OK );

our $VERSION = '0.01';
1;

# -----------------------------------------------------------------------------
# my $result = ccall \&sub;
#
sub ccall ($;$)
{
	my $wantarray;
	my $sub;
	
	@_ or die "ccall: argument required";
	if( UNIVERSAL::isa($_[0], 'CODE') )
	{
		$wantarray = (caller(1))[5];
		$sub       = shift;
	}else
	{
		$wantarray = shift;
		$sub       = shift;
	}
	
	Contextual::Call->new({
		context => $wantarray,
		sub     => $sub,
	});
}

# -----------------------------------------------------------------------------
# $pkg->new({ context => wantarray, sub => \&sub });
#
sub new
{
	my $pkg  = shift;
	my $opts = shift;
	
	my $wantarray = $opts->{context};
	my $sub       = $opts->{sub};
	my @result;
	
	if( $wantarray )
	{
		# list context.
		@result = $sub->(@_);
	}elsif( defined($wantarray) )
	{
		# scalar context.
		$result[0] = $sub->(@_);
	}else
	{
		# void context.
		$sub->(@_);
	}
	
	my $this = bless {}, __PACKAGE__;
	$this->{context} = $wantarray;
	$this->{result}  = \@result;
	
	$this;
}

# -----------------------------------------------------------------------------
# $cresult->result();
#
sub result
{
	my $this = shift;
	my $wantarray = $this->{context};
	if( $wantarray )
	{
		# list context.
		@{$this->{result}};
	}elsif( defined($wantarray) )
	{
		# scalar context.
		$this->{result}->[0];
	}else
	{
		# void context.
		return;
	}
}

# -----------------------------------------------------------------------------
# End of Module.
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# End of File.
# -----------------------------------------------------------------------------
__END__