File Coverage

blib/lib/Data/Focus/Lens/Composite.pm
Criterion Covered Total %
statement 24 24 100.0
branch 2 2 100.0
condition n/a
subroutine 6 6 100.0
pod 2 2 100.0
total 34 34 100.0


line stmt bran cond sub pod time code
1             package Data::Focus::Lens::Composite;
2 23     23   115 use strict;
  23         52  
  23         810  
3 23     23   208 use warnings;
  23         33  
  23         726  
4 23     23   12410 use parent qw(Data::Focus::Lens);
  23         11388  
  23         180  
5              
6             sub new {
7 12834     12834 1 19843 my ($class, @lenses) = @_;
8 12834         33408 require Data::Focus;
9 12834         13118 @lenses = map { Data::Focus->coerce_to_lens($_) } @lenses;
  12866         24115  
10 12834         49063 return bless \@lenses, $class;
11             }
12              
13             sub apply_lens {
14 12835     12835 1 14677 my ($self, $applicative_class, $part_mapper, $whole) = @_;
15 12835         16558 my $top_lens = $self->[0];
16 12835 100       20889 if(!defined($top_lens)) {
17 44         111 return $part_mapper->($whole);
18             }
19 12791         15954 foreach my $lens (reverse @{$self}[1 .. $#$self]) {
  12791         25262  
20 77         75 my $cur_part_mapper = $part_mapper;
21 77     111   292 $part_mapper = sub { $lens->apply_lens($applicative_class, $cur_part_mapper, shift) };
  111         254  
22             }
23 12791         30445 return $top_lens->apply_lens($applicative_class, $part_mapper, $whole);
24             }
25              
26              
27             1;
28             __END__