wanna_code_perl has asked for the wisdom of the Perl Monks concerning the following question:
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.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Contextual::Return blocks: can they be made to return the actual result?
by Corion (Patriarch) on Jul 13, 2013 at 13:42 UTC | |
by wanna_code_perl (Friar) on Jul 13, 2013 at 15:27 UTC | |
Re: Contextual::Return blocks: can they be made to return the actual result?
by moritz (Cardinal) on Jul 13, 2013 at 13:54 UTC | |
by wanna_code_perl (Friar) on Jul 13, 2013 at 15:31 UTC | |
Re: Contextual::Return blocks: can they be made to return the actual result?
by tobyink (Canon) on Jul 13, 2013 at 15:53 UTC | |
by wanna_code_perl (Friar) on Jul 14, 2013 at 03:00 UTC |