| Devel-RunBlock documentation | Contained in the Devel-RunBlock distribution. |
Devel::RunBlock - run coderef as block
Version 0.01
use Devel::RunBlock qw(runblock);
This module can three functions.
runblock $sub;
run $sub as code block.
if returned in block, it returns from sub which
calls runblock function.
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.
my $wa = long_wantarray $uplevel;
like a wantarray builtin function, but can test
caller's wantarray state.
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.
YAMASHINA Hio, <hio at cpan.org>
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.
- long_return could not return values.
You can find documentation for this module with the perldoc command.
perldoc Devel::RunBlock
You can also look for information at:
Copyright 2006 YAMASHINA Hio, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| 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__