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 7 7 100.0
pod 2 3 66.6
total 35 36 97.2


line stmt bran cond sub pod time code
1             package Data::Focus::Lens::Composite;
2 23     23   121 use strict;
  23         48  
  23         699  
3 23     23   94 use warnings;
  23         26  
  23         537  
4 23     23   10027 use parent qw(Data::Focus::Lens);
  23         6082  
  23         101  
5              
6             sub new {
7 14     14 1 3220 my ($class, @lenses) = @_;
8 14         48 require Data::Focus;
9 14         52 $_ = Data::Focus->coerce_to_lens($_) for @lenses;
10 14         129 return bless \@lenses, $class;
11             }
12              
13             ## class method: internal use only.
14             sub apply_composite_lens {
15 98     98 0 175 my (undef, $lenses, $applicative_class, $part_mapper, $whole) = @_;
16 98         175 my $top_lens = $lenses->[0];
17 98 100       201 if(!defined($top_lens)) {
18 44         90 return $part_mapper->($whole);
19             }
20 54         118 foreach my $lens (reverse @{$lenses}[1 .. $#$lenses]) {
  54         252  
21 77         80 my $cur_part_mapper = $part_mapper;
22 77     111   303 $part_mapper = sub { $lens->apply_lens($applicative_class, $cur_part_mapper, shift) };
  111         250  
23             }
24 54         199 return $top_lens->apply_lens($applicative_class, $part_mapper, $whole);
25             }
26              
27             sub apply_lens {
28 15     15 1 42 ref($_[0])->apply_composite_lens(@_);
29             }
30              
31              
32             1;
33             __END__