File Coverage

blib/lib/Text/APL/Reader.pm
Criterion Covered Total %
statement 41 42 97.6
branch 9 12 75.0
condition n/a
subroutine 10 10 100.0
pod 1 1 100.0
total 61 65 93.8


line stmt bran cond sub pod time code
1             package Text::APL::Reader;
2              
3 3     3   51679 use strict;
  3         15  
  3         78  
4 3     3   14 use warnings;
  3         4  
  3         67  
5              
6 3     3   11 use base 'Text::APL::Base';
  3         4  
  3         1008  
7              
8             sub build {
9 24     24 1 31 my $self = shift;
10 24         31 my ($input) = @_;
11              
12 24         26 my $reader;
13              
14 24 100       72 if (!ref $input) {
    100          
    100          
    50          
15 1         3 $reader = $self->_build_file_reader($input);
16             }
17             elsif (ref $input eq 'GLOB') {
18 1         3 $reader = $self->_build_file_handle_reader($input);
19             }
20             elsif (ref $input eq 'SCALAR') {
21 21         42 $reader = $self->_build_string_reader($input);
22             }
23             elsif (ref $input eq 'CODE') {
24 1         2 $reader = $input;
25             }
26             else {
27 0         0 die 'Do not know how to read';
28             }
29              
30 24         46 return $reader;
31             }
32              
33             sub _build_file_reader {
34 1     1   1 my $self = shift;
35 1         11 my ($input) = @_;
36              
37 1 50       35 open my $fh, '<', $input or die "Can't open '$input': $!";
38              
39 1 50       8 if (my $charset = $self->{charset}) {
40 1     1   29 binmode $fh, ":encoding($charset)";
  1         5  
  1         2  
  1         4  
41             }
42              
43 1         9007 return $self->_build_file_handle_reader($fh);
44             }
45              
46             sub _build_file_handle_reader {
47 2     2   12 my $self = shift;
48 2         4 my ($input) = @_;
49              
50             sub {
51 2     2   38 my ($cb) = @_;
52 2         49 while (defined(my $line = <$input>)) {
53 2         23 $cb->($line);
54             }
55 2         25 $cb->();
56 2         7 };
57             }
58              
59             sub _build_string_reader {
60 21     21   27 my $self = shift;
61 21         28 my ($input) = @_;
62              
63             sub {
64 21     21   35 my ($cb) = @_;
65              
66 21         25 $cb->(${$input});
  21         42  
67 21         47 $cb->();
68 21         67 };
69             }
70              
71             1;
72             __END__