File Coverage

blib/lib/Data/Focus/Lens/HashArray/All.pm
Criterion Covered Total %
statement 37 37 100.0
branch 12 12 100.0
condition n/a
subroutine 10 10 100.0
pod 2 2 100.0
total 61 61 100.0


line stmt bran cond sub pod time code
1             package Data::Focus::Lens::HashArray::All;
2 5     5   2423 use strict;
  5         6  
  5         156  
3 5     5   18 use warnings;
  5         4  
  5         125  
4 5     5   19 use parent qw(Data::Focus::Lens);
  5         7  
  5         21  
5 5     5   238 use Carp;
  5         5  
  5         1819  
6              
7             sub new {
8 20     20 1 15295 my ($class, %args) = @_;
9 20         158 return bless {
10             immutable => !!$args{immutable}
11             }, $class;
12             }
13              
14             sub _set_array {
15 561     561   757 my ($self, $whole, @parts) = @_;
16 561 100       1878 return $whole if !@parts;
17 281 100       504 if($self->{immutable}) {
18 140         392 return \@parts;
19             }else {
20 141         321 @$whole = @parts;
21 141         482 return $whole;
22             }
23             }
24              
25             sub _set_hash {
26 561     561   783 my ($self, $whole, $keys, @parts) = @_;
27 561 100       1862 return $whole if !@parts;
28 281 100       1028 my $ret = $self->{immutable} ? {%$whole} : $whole;
29 281         1289 $ret->{$keys->[$_]} = $parts[$_] foreach 0 .. $#$keys;
30 281         1075 return $ret;
31             }
32              
33             sub apply_lens {
34 2372     2372 1 2667 my ($self, $app_class, $part_mapper, $whole) = @_;
35 2372         3178 my $type = ref($whole);
36 2372 100       4635 if($type eq "ARRAY") {
    100          
37             return $app_class->build(sub {
38 561     561   1095 $self->_set_array($whole, @_)
39 594         2408 }, map { $part_mapper->($_) } @$whole);
  1191         1919  
40             }elsif($type eq "HASH") {
41 594         1536 my @keys = keys %$whole;
42             return $app_class->build(sub {
43 561     561   1147 $self->_set_hash($whole, \@keys, @_)
44 594         1947 }, map { $part_mapper->($_) } @{$whole}{@keys});
  598         1278  
  594         1509  
45             }else {
46 1184         2681 return $app_class->pure($whole);
47             }
48             }
49              
50              
51              
52             1;
53             __END__