File Coverage

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


line stmt bran cond sub pod time code
1             package Data::Focus::Lens::HashArray::Recurse;
2 5     5   2397 use strict;
  5         9  
  5         147  
3 5     5   18 use warnings;
  5         5  
  5         107  
4 5     5   16 use parent qw(Data::Focus::Lens);
  5         5  
  5         18  
5              
6             sub new {
7 24     24 1 15807 my ($class, %args) = @_;
8 24         168 my $self = bless {
9             immutable => !!$args{immutable}
10             }, $class;
11 24         77 return $self;
12             }
13              
14             sub _set_array {
15 703     703   1359 my ($self, $whole, @parts) = @_;
16 703 100       2405 return $whole if !@parts;
17 422 100       1065 if($self->{immutable}) {
18 210         860 return \@parts;
19             }else {
20 212         547 @$whole = @parts;
21 212         932 return $whole;
22             }
23             }
24              
25             sub _set_hash {
26 843     843   1483 my ($self, $whole, $keys, @parts) = @_;
27 843 100       2477 return $whole if !@parts;
28 562 100       2030 my $ret = $self->{immutable} ? {%$whole} : $whole;
29 562         2910 $ret->{$keys->[$_]} = $parts[$_] foreach 0 .. $#$keys;
30 562         2375 return $ret;
31             }
32              
33             sub apply_lens {
34 3943     3943 1 5536 my ($self, $app_class, $part_mapper, $data) = @_;
35 3943         5244 my $type = ref($data);
36 3943 100       7977 if($type eq "ARRAY") {
    100          
37 783         1195 my @fparts = map { $self->apply_lens($app_class, $part_mapper, $_) } @$data;
  1573         2884  
38             return $app_class->build(sub {
39 703     703   1397 $self->_set_array($data, @_);
40 783         4266 }, @fparts);
41             }elsif($type eq "HASH") {
42 915         2355 my @keys = keys %$data;
43 915         1176 my @fparts = map { $self->apply_lens($app_class, $part_mapper, $_) } @{$data}{@keys};
  915         1749  
  915         1622  
44             return $app_class->build(sub {
45 843     843   1787 $self->_set_hash($data, \@keys, @_);
46 915         4871 }, @fparts);
47             }else {
48 2245         4750 return $part_mapper->($data);
49             }
50             }
51              
52             1;
53             __END__