Context::Preserve(3)

πŸ’– NAME πŸ’–

This is Context::Preserve(3), fresh from the User Contributed Perl Documentation β€” hi bestie, welcome to the group chat πŸ’–

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.03 ✨


✨ 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. It's giving painful because of contexts, bestie: the original function can behave different if it's called in void, scalar, or list context. You could ignore the various cases and just pick one, but that's fragile β€” no cap. To do things right, you need to see which case you're being called in, and then call the function in that context. That 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. Slay. πŸ’…


πŸŽ€ 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 email bug-Context-Preserve@rt.cpan.org β€” mailto target: 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 ⭐

  • Karen Etheridge <ether@cpan.org>
  • Jonathan Rockway <jon@jrock.us>

This software is copyright (c) 2008 by Infinity Interactive.

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


πŸ’œ and that's the tea! This page is from perl v5.42.0, dated 2017-11-04. bye bestie! πŸ’…βœ¨

πŸ“¦ where this page comes from