File Coverage

blib/lib/PerlX/Let.pm
Criterion Covered Total %
statement 32 32 100.0
branch 11 12 91.6
condition 5 6 83.3
subroutine 8 8 100.0
pod n/a
total 56 58 96.5


line stmt bran cond sub pod time code
1             package PerlX::Let;
2              
3             # ABSTRACT: Syntactic sugar for lexical state constants
4              
5 1     1   126704 use v5.12;
  1         13  
6 1     1   5 use warnings;
  1         2  
  1         24  
7              
8 1     1   499 use Const::Fast ();
  1         2514  
  1         28  
9 1     1   429 use Keyword::Simple 0.04;
  1         28424  
  1         31  
10 1     1   782 use Text::Balanced ();
  1         15865  
  1         330  
11              
12             our $VERSION = 'v0.3.0';
13              
14              
15             sub import {
16 1     1   19 Keyword::Simple::define 'let', \&_rewrite_let;
17             }
18              
19             sub unimport {
20 1     1   150 Keyword::Simple::undefine 'let';
21             }
22              
23             sub _rewrite_let {
24 12     12   13334 my ($ref) = @_;
25              
26 12         25 my $let = "";
27              
28 12         35 my ( $name, $val );
29              
30 12         45 ( $name, $$ref ) = Text::Balanced::extract_variable($$ref);
31 12 100       2312 die "A variable name is required for let" unless defined $name;
32 10 100       98 $$ref =~ s/^\s*\=>?\s*// or die "An assignment is required for let";
33 8         25 ( $val, $$ref ) = Text::Balanced::extract_quotelike($$ref);
34 8 100       446 ( $val, $$ref ) = Text::Balanced::extract_bracketed( $$ref, '({[' )
35             unless defined $val;
36              
37 8 100       779 unless ( defined $val ) {
38 5         23 ($val) = $$ref =~ /^(\S+)/;
39 5         27 $$ref =~ s/^\S+//;
40             }
41              
42 8 50       19 die "A value is required for let" unless defined $val;
43              
44 8 100 66     60 if ($val !~ /[\$\@\%\&]/ && ($] >= 5.028 || substr($name, 0, 1) eq '$')) {
      100        
45              
46             # We can't use Const::Fast on state variables, so we use this workaround.
47              
48 5         18 $let .= "use feature 'state'; state $name = $val; unless (state \$__perlx_let_state_is_set = 0) { Const::Fast::_make_readonly(\\$name); \$__perlx_let_state_is_set = 1; };";
49              
50             }
51             else {
52              
53 3         8 $let .= "Const::Fast::const my $name => $val; ";
54             }
55              
56 8         550 substr( $$ref, 0, 0 ) = $let;
57              
58             }
59              
60              
61              
62             1;
63              
64             __END__