Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
Context::Preserve(3)  User Contributed Perl Documentation Context::Preserve(3)

NAME
       Context::Preserve - Run code after a subroutine call, preserving	the
       context the subroutine would have seen if it were the last statement in
       the caller

VERSION
       version 0.02

SYNOPSIS
       Have you	ever written this?

	   my ($result,	@result);

	   # run a sub in the correct context
	   if(!defined wantarray){
	       some::code();
	   }
	   elsif(wantarray){
	       @result = some::code();
	   }
	   else	{
	       $result = some::code();
	   }

	   # do	something after	some::code
	   $_ += 42 for	(@result, $result);

	   # finally return the	correct	value
	   if(!defined wantarray){
	       return;
	   }
	   elsif(wantarray){
	       return @result;
	   }
	   else	{
	       return $result;
	   }

       Now you can just	write this instead:

	 use Context::Preserve;

	 return	preserve_context { some::code()	}
		    after => sub { $_ += 42 for	@_ };

DESCRIPTION
       Sometimes you need to call a function, get the results, act on the
       results,	then return the	result of the function.	 This is painful
       because of contexts; the	original function can behave different if it's
       called in void, scalar, or list context.	 You can ignore	the various
       cases and just pick one,	but that's fragile.  To	do things right, you
       need to see which case you're being called in, and then call the
       function	in that	context.  This results in 3 code paths,	which is a
       pain to type in (and maintain).

       This module automates the process.  You provide a coderef that is the
       "original function", and	another	coderef	to run after the original
       runs.  You can modify the return	value (aliased to @_) here, and	do
       whatever	else you need to do.  "wantarray" is correct inside both
       coderefs; in "after", though, the return	value is ignored and the value
       "wantarray" returns is related to the context that the original
       function	was called in.

EXPORT
       "preserve_context"

FUNCTIONS
   preserve_context { original } [after|replace] => sub	{ after	}
       Invokes "original" in the same context as "preserve_context" was	called
       in, save	the results, runs "after" in the same context, then returns
       the result of "original"	(or "after" if "replace" is used).

       If the second argument is "after", then you can modify @_ to affect the
       return value.  "after"'s	return value is	ignored.

       If the second argument is "replace", then modifying @_ doesn't do
       anything.  The return value of "after" is returned from
       "preserve_context" instead.

       Run "preserve_context" like this:

	 sub whatever {
	     ...
	     return preserve_context { orginal_function() }
			after => sub { modify @_	  };
	 }

	 or

	 sub whatever {
	     ...
	     return preserve_context   { orginal_function() }
			replace	=> sub { return	@new_return };
	 }

       Note that there's no comma between the first block and the "after =>"
       part.  This is how perl parses functions	with the "(&@)"	prototype.
       The alternative is to say:

	     preserve_context(sub { original },	after => sub { after });

       You can pick the	one you	like, but I think the first version is much
       prettier.

SUPPORT
       Bugs may	be submitted through the RT bug	tracker
       <https://rt.cpan.org/Public/Dist/Display.html?Name=Context-Preserve>
       (or bug-Context-Preserve@rt.cpan.org <mailto:bug-Context-
       Preserve@rt.cpan.org>).

       I am also usually active	on irc,	as 'ether' at "irc.perl.org".

AUTHOR
       Jonathan	Rockway	<jrockway@cpan.org>

CONTRIBUTORS
       o   Jonathan Rockway <jon@jrock.us>

       o   Karen Etheridge <ether@cpan.org>

COPYRIGHT AND LICENCE
       This software is	copyright (c) 2007 by Jonathan Rockway.

       This is free software; you can redistribute it and/or modify it under
       the same	terms as the Perl 5 programming	language system	itself.

perl v5.24.1			  2017-05-11		  Context::Preserve(3)

NAME | VERSION | SYNOPSIS | DESCRIPTION | EXPORT | FUNCTIONS | SUPPORT | AUTHOR | CONTRIBUTORS | COPYRIGHT AND LICENCE

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=Context::Preserve&sektion=3&manpath=FreeBSD+12.0-RELEASE+and+Ports>

home | help