File Coverage

blib/lib/Text/CSV.pm
Criterion Covered Total %
statement 46 50 92.0
branch 8 12 66.6
condition 4 5 80.0
subroutine 12 16 75.0
pod 3 6 50.0
total 73 89 82.0


line stmt bran cond sub pod time code
1             package Text::CSV;
2              
3              
4 31     31   1966334 use strict;
  31         295  
  31         860  
5 31     31   188 use Exporter;
  31         54  
  31         1098  
6 31     31   168 use Carp ();
  31         59  
  31         860  
7 31     31   196 use vars qw( $VERSION $DEBUG @ISA @EXPORT_OK );
  31         57  
  31         3212  
8             @ISA = qw( Exporter );
9             @EXPORT_OK = qw( csv );
10              
11             BEGIN {
12 31     31   109 $VERSION = '2.00';
13 31         17711 $DEBUG = 0;
14             }
15              
16             # if use CSV_XS, requires version
17             my $Module_XS = 'Text::CSV_XS';
18             my $Module_PP = 'Text::CSV_PP';
19             my $XS_Version = '1.02';
20              
21             my $Is_Dynamic = 0;
22              
23             my @PublicMethods = qw/
24             version error_diag error_input
25             known_attributes csv
26             PV IV NV
27             /;
28             #
29              
30             # Check the environment variable to decide worker module.
31              
32             unless ($Text::CSV::Worker) {
33             $Text::CSV::DEBUG and Carp::carp("Check used worker module...");
34              
35             if ( exists $ENV{PERL_TEXT_CSV} ) {
36             if ($ENV{PERL_TEXT_CSV} eq '0' or $ENV{PERL_TEXT_CSV} eq 'Text::CSV_PP') {
37             _load_pp() or Carp::croak $@;
38             }
39             elsif ($ENV{PERL_TEXT_CSV} eq '1' or $ENV{PERL_TEXT_CSV} =~ /Text::CSV_XS\s*,\s*Text::CSV_PP/) {
40             _load_xs() or _load_pp() or Carp::croak $@;
41             }
42             elsif ($ENV{PERL_TEXT_CSV} eq '2' or $ENV{PERL_TEXT_CSV} eq 'Text::CSV_XS') {
43             _load_xs() or Carp::croak $@;
44             }
45             else {
46             Carp::croak "The value of environmental variable 'PERL_TEXT_CSV' is invalid.";
47             }
48             }
49             else {
50             _load_xs() or _load_pp() or Carp::croak $@;
51             }
52              
53             }
54              
55             sub new { # normal mode
56 538     538 1 472647 my $proto = shift;
57 538   100     2377 my $class = ref($proto) || $proto;
58              
59 538 100       1203 unless ( $proto ) { # for Text::CSV_XS/PP::new(0);
60 1         62 return eval qq| $Text::CSV::Worker\::new( \$proto ) |;
61             }
62              
63             #if (ref $_[0] and $_[0]->{module}) {
64             # Carp::croak("Can't set 'module' in non dynamic mode.");
65             #}
66              
67 537 100       2145 if ( my $obj = $Text::CSV::Worker->new(@_) ) {
68 486         1002 $obj->{_MODULE} = $Text::CSV::Worker;
69 486         808 bless $obj, $class;
70 486         3481 return $obj;
71             }
72             else {
73 50         160 return;
74             }
75              
76              
77             }
78              
79              
80 0     0 0 0 sub require_xs_version { $XS_Version; }
81              
82              
83             sub module {
84 2     2 0 3 my $proto = shift;
85             return !ref($proto) ? $Text::CSV::Worker
86 2 50       14 : ref($proto->{_MODULE}) ? ref($proto->{_MODULE}) : $proto->{_MODULE};
    50          
87             }
88              
89             *backend = *module;
90              
91              
92             sub is_xs {
93 0     0 1 0 return $_[0]->module eq $Module_XS;
94             }
95              
96              
97             sub is_pp {
98 1     1 1 4 return $_[0]->module eq $Module_PP;
99             }
100              
101              
102 0     0 0 0 sub is_dynamic { $Is_Dynamic; }
103              
104 0     0   0 sub _load_xs { _load($Module_XS, $XS_Version) }
105              
106 31     31   75 sub _load_pp { _load($Module_PP) }
107              
108             sub _load {
109 31     31   68 my ($module, $version) = @_;
110 31   50     181 $version ||= '';
111              
112 31 50       67 $Text::CSV::DEBUG and Carp::carp "Load $module.";
113              
114 31     31   29266 eval qq| use $module $version |;
  31         103  
  31         1192  
  31         1880  
115              
116 31 50       156 return if $@;
117              
118 31         350 push @Text::CSV::ISA, $module;
119 31         151 $Text::CSV::Worker = $module;
120              
121 31         370 local $^W;
122 31     31   226 no strict qw(refs);
  31         69  
  31         4124  
123              
124 31         112 for my $method (@PublicMethods) {
125 248         310 *{"Text::CSV::$method"} = \&{"$module\::$method"};
  248         830  
  248         582  
126             }
127 31         236 return 1;
128             }
129              
130              
131              
132             1;
133             __END__