X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSub%2FQuote.pm;h=4a9478e619f35fb9eb2f227f83c75314203a0afd;hb=4b46a4be88ff40d07ff8c22d0fa7d51380f19067;hp=37997d24f4b063142ad1cb71b9fcfa79c74683a8;hpb=072d158f9aa281b39c25641923f19c896cac2d80;p=gitmo%2FMoo.git diff --git a/lib/Sub/Quote.pm b/lib/Sub/Quote.pm index 37997d2..4a9478e 100644 --- a/lib/Sub/Quote.pm +++ b/lib/Sub/Quote.pm @@ -37,7 +37,11 @@ sub inlinify { $do.'my ('.$code_args.') = ('.$args.'); '.$body.' }'; } } else { - $do.($local ? 'local ' : '').'@_ = ('.$args.'); '.$code.' }'; + my $assign = ''; + if ($local || $args ne '@_') { + $assign = ($local ? 'local ' : '').'@_ = ('.$args.'); '; + } + $do.$assign.$code.' }'; } } @@ -174,10 +178,7 @@ passed subroutine name on undefer. my $coderef = unquote_sub $sub; -Forcibly replace subroutine with actual code. Note that for performance -reasons all quoted subs declared so far will be globally unquoted/parsed in -a single eval. This means that if you have a syntax error in one of your -quoted subs you may find out when some other sub is unquoted. +Forcibly replace subroutine with actual code. If $sub is not a quoted sub, this is a no-op. @@ -195,7 +196,7 @@ version for convenience. =head2 inlinify - my $prelude = capture_unroll { + my $prelude = capture_unroll '$captures', { '$x' => 1, '$y' => 2, }; @@ -212,14 +213,17 @@ arguments. =head2 capture_unroll - my $prelude = capture_unroll { + my $prelude = capture_unroll '$captures', { '$x' => 1, '$y' => 2, - }; + }, 4; + +Arguments: $from, \%captures, $indent Generates a snippet of code which is suitable to be used as a prelude for -L. The keys are the names of the variables and the values are (duh) -the values. Note that references work as values. +L. C<$from> is a string will be used as a hashref in the resulting +code. The keys of C<%captures> are the names of the variables and the values +are ignored. C<$indent> is the number of spaces to indent the result by. =head1 CAVEATS @@ -252,6 +256,20 @@ It might turn up in the intended context as follows: Which will obviously return from foo, when all you meant to do was return from the code context in quote_sub and proceed with running important code b. +=head2 strictures + +Sub::Quote compiles quoted subs in an environment where C<< use strictures >> +is in effect. L enables L and FATAL L. + +The following dies I<< Use of uninitialized value in print... >> + + no warnings; + quote_sub 'Silly::kitty', q{ print undef }; + +If you need to disable parts of strictures, do it within the quoted sub: + + quote_sub 'Silly::kitty', q{ no warnings; print undef }; + =head1 SUPPORT See L for support and contact informations.