File Coverage

blib/lib/Kavorka/TraitFor/Parameter/locked.pm
Criterion Covered Total %
statement 17 17 100.0
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 23 23 100.0


line stmt bran cond sub pod time code
1 1     1   501 use 5.014;
  1         2  
2 1     1   3 use strict;
  1         1  
  1         19  
3 1     1   3 use warnings;
  1         1  
  1         61  
4              
5             package Kavorka::TraitFor::Parameter::locked;
6              
7             our $AUTHORITY = 'cpan:TOBYINK';
8             our $VERSION = '0.037';
9              
10 1     1   3 use Moo::Role;
  1         1  
  1         5  
11              
12 1     1   809 use Hash::Util;
  1         2392  
  1         5  
13 1     1   566 use Types::Standard qw(Dict);
  1         52148  
  1         11  
14              
15             around _injection_assignment => sub
16             {
17             my $next = shift;
18             my $self = shift;
19             my ($sig, $var, $val) = @_;
20            
21             my $str = $self->$next(@_);
22            
23             state $_FIND_KEYS = sub {
24             return unless $_[0];
25             my ($dict) = grep {
26             $_->is_parameterized
27             and $_->has_parent
28             and $_->parent->strictly_equals(Dict)
29             } $_[0], $_[0]->parents;
30             return unless $dict;
31             return if ref($dict->parameters->[-1]) eq q(HASH);
32             my @keys = sort keys %{ +{ @{ $dict->parameters } } };
33             return unless @keys;
34             \@keys;
35             };
36            
37             my $legal_keys = $_FIND_KEYS->($self->type);
38             my $quoted_keys = $legal_keys ? join(q[,], q[], map B::perlstring($_), @$legal_keys) : '';
39             my $ref_var = $self->sigil eq '$' ? $var : "\\$var";
40            
41             $str .= "&Hash::Util::unlock_hash($ref_var);";
42             $str .= "&Hash::Util::lock_keys($ref_var $quoted_keys);";
43            
44             return $str;
45             };
46              
47             1;