Devel::RunBlock - run coderef as block


Devel-RunBlock documentation Contained in the Devel-RunBlock distribution.

Index


Code Index:

NAME

Top

Devel::RunBlock - run coderef as block

VERSION

Top

Version 0.01

SYNOPSIS

Top

 use Devel::RunBlock qw(runblock);

EXPORT

Top

This module can three functions.

FUNCTIONS

Top

runblock

 runblock $sub;

run $sub as code block. if returned in block, it returns from sub which calls runblock function.

runblock_state

 my $rstate = runblock_state { code.. };

run $sub and return whether $sub is returned by return statement or leave scope.

$rstate==1 means returned by return statement. $rstate==0 means returned by left scope.

long_wantarray

 my $wa = long_wantarray $uplevel;

like a wantarray builtin function, but can test caller's wantarray state.

long_return

 long_return $uplevel;
 #long_return $uplevel, $rval..;

long jump return. currently, could not return values.

$uplevel=0 means no return (just return your sub). $uplevel=1 means normal return, just same as normal return statement.

AUTHOR

Top

YAMASHINA Hio, <hio at cpan.org>

BUGS

Top

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

KNOWN BUGS

- long_return could not return values.

SUPPORT

Top

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



    perldoc Devel::RunBlock

You can also look for information at:

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Devel-RunBlock

* CPAN Ratings

http://cpanratings.perl.org/d/Devel-RunBlock

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Devel-RunBlock

* Search CPAN

http://search.cpan.org/dist/Devel-RunBlock

ACKNOWLEDGEMENTS

Top

COPYRIGHT & LICENSE

Top


Devel-RunBlock documentation Contained in the Devel-RunBlock distribution.

## ----------------------------------------------------------------------------
#  Devel::RunBlock.
# -----------------------------------------------------------------------------
# Mastering programmed by YAMASHINA Hio
#
# Copyright 2006 YAMASHINA Hio
# -----------------------------------------------------------------------------
# $Id$
# -----------------------------------------------------------------------------
package Devel::RunBlock;
use strict;
use warnings;
use base qw(Exporter DynaLoader);
our @EXPORT_OK = qw(
	runblock runblock_state long_wantarray long_return
);
our %EXPORT_TAGS = ( all => \@EXPORT_OK );

our $VERSION = '0.01';
our ($Result, @Result);

(__PACKAGE__)->bootstrap($VERSION);

# -----------------------------------------------------------------------------
# runblock_state($coderef, @args).
#
sub runblock_state($)
{
	my $code = shift;
	my ($rtype, @retval) = _runblock($code, @_);
	wantarray ? ($rtype, @retval) : $rtype;
}

# -----------------------------------------------------------------------------
# runblock($coderef).
#
sub runblock($)
{
	my $code = shift;
	my ($rtype, @retval) = _runblock($code);
	if( $rtype )
	{
		# return by 'return' statement.
		long_return(2, ($rtype, @retval));
	}
	wantarray ? ($rtype, @retval ) : $rtype;
}

# -----------------------------------------------------------------------------
# long_wantarray($up);
#
sub long_wantarray(;$)
{
	_long_wantarray(shift||0);
}

# -----------------------------------------------------------------------------
# long_return($up, $retval).
#
sub long_return($@)
{
	my $up = shift;
	my $wantarray = long_wantarray($up+1);
	#print "up#$up+1 "._ris($wantarray)."\n";
	if( defined($wantarray) )
	{
		if( $wantarray )
		{
			@Result = @_;
		}else
		{
			$Result = $_[0];
		}
	}
	#print "..call _long_return xsub..\n";
	_long_return($up+1);
	die "NOT_REACH_HERE";
}

sub _ris
{
	my $wa = shift;
	!defined $wa ? 'G_VOID'   # void:2
	  : !$wa     ? 'G_SCALAR' # scalar:1
	  : 'G_ARRAY';            # array:0
}

sub __ret_array  { my@r=@Result; undef @Result; @r }
sub __ret_scalar { my$r=$Result; undef $Result; $r }
sub __ret_void   { return; }

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