NAME

Context::Handle - A convenient context propagation proxy thingy.

SYNOPSIS

use Context::Handle qw/context_sensitive/;

sub wrapping {
	my $rv = context_sensitive {
		$some_thing->method(); # anything really
	};

	# you can do anything here

	$rv->return; # returns the value in the right context

	# not reached
}

DESCRIPTION

This module lets you delegate to another method and return the value without caring about context propagation.

The level of support is tied to what Want does - this module tries to make all the distinctions Want can make fully supported, for example array dereference context, boolean context, etc.

EXPORTS

Nothing is exported by default.

context_sensitive BLOCK

This is a convenience shortcut that calls new

METHODS

Regular Usage

new $code

This method invokes $code in the calling sub's context, and returns an object that saves the return value.

rv_container

This instance method returns the return value container object. The only useful methods for the RV containers is value, which has a delegator anyway.

value

This returns the value from the rv_container

return

This (ab)uses Want to perform a double return.

Saying

$rv->return;

is just like

return $rv->value;

Introspection

Incidientially due to the needs of the wrapping layer this module also provides an OO interface to Want, more or less ;-)

bool
void
scalar
list
refarray
refhash
refscalar
refobject
refcode
refglob

All of these methods return boolean values, with respect to the

TODO

  • pseudoboolean context - the right side of && and the left side of || evaulate in boolean context, but still return a meaningful value.

  • Glob assignment context. I'm not sure how to make the value propagate back once it's been assigned to the glob - it's hard to know what it is without inspecting the slots and that's kinda tricky.

  • Lvalue assignment

  • use Sub::Uplevel to hide the wrapping

  • context arity - Want's count stuff. This can probably be done using @list[0..$x] = (...), but might need to be emulated with eval. See perldoc -f split.

ACKNOWLEGMENTS

Robin Houston for Want and lots of help by email

AUTHOR

Yuval Kogman <nothingmuch@woobling.org>

COPYRIGHT & LICENSE

Copyright (c) 2006 the aforementioned authors. All rights
reserved. This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.