Instead of returning the value I want, Contextual::Return returns a Contextual::Return::Value, an opaque inside-out object, that allows polymorphic access to the returned value. Suppose I have this:
use Contextual::Return; sub foo { my $blah = bless { name => shift }, 'whatever'; return VOID { croak "Useless use of foo() in void context" } STR { $blah->{name} } OBJREF { $blah } DEFAULT { $blah } } my $foo = foo('Boris');
Suppose I have some other code expecting a certain object type. Now ref($foo) is completely meaningless. Sure, I can do $foo->isa, but I still can't access my underlying data directly: $foo->{name} blows up:
DEFAULT block did not return a suitable reference to the hash dereference at ...
The only way I've been able to find to get at the HASH ref is with some awful incantation like eval $foo->Contextual::Return::DUMP(), which of course does not contain the original references.
These are just a couple of the issues for example's sake. I could work around them, but suffice to say it's making my life harder, not easier. Did I miss the point of this module? Can the C::R blocks be made to return the actual references within them, instead of the C::R::Value objects? I thought the FIXED modifier might do this, but it didn't seem to make a difference.
In reply to Contextual::Return blocks: can they be made to return the actual result? by wanna_code_perl
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |