File Coverage

blib/lib/Perl/APIReference.pm
Criterion Covered Total %
statement 38 65 58.4
branch 6 16 37.5
condition n/a
subroutine 10 14 71.4
pod 2 2 100.0
total 56 97 57.7


line stmt bran cond sub pod time code
1             package Perl::APIReference;
2              
3 2     2   20398 use 5.006;
  2         7  
4 2     2   8 use strict;
  2         2  
  2         37  
5 2     2   8 use warnings;
  2         7  
  2         52  
6 2     2   8 use Carp qw/croak/;
  2         3  
  2         135  
7 2     2   1450 use version;
  2         3818  
  2         12  
8 2     2   113 use Sereal::Encoder;
  2         2  
  2         70  
9 2     2   8 use Sereal::Decoder;
  2         4  
  2         101  
10              
11             our $VERSION = '0.21';
12              
13             use Class::XSAccessor
14 2         20 getters => {
15             'index' => 'index',
16             'perl_version' => 'perl_version',
17 2     2   1328 };
  2         4980  
18              
19             sub _par_loader_hint {
20 0     0   0 require Perl::APIReference::Generator;
21 0         0 require Perl::APIReference::V5_022_000;
22             }
23              
24             our %Perls = (
25             5.022 => 'V5_022_000',
26             5.020002 => 'V5_020_002',
27             5.020001 => 'V5_020_001',
28             5.02 => 'V5_020_000',
29             5.018002 => 'V5_018_002',
30             5.018001 => 'V5_018_001',
31             5.018000 => 'V5_018_000',
32             5.016003 => 'V5_016_003',
33             5.016002 => 'V5_016_002',
34             5.016001 => 'V5_016_001',
35             5.016 => 'V5_016_000',
36             5.014004 => 'V5_014_004',
37             5.014003 => 'V5_014_003',
38             5.014002 => 'V5_014_002',
39             5.014001 => 'V5_014_001',
40             5.014 => 'V5_014_000',
41             5.012005 => 'V5_012_005',
42             5.012004 => 'V5_012_004',
43             5.012003 => 'V5_012_003',
44             5.012002 => 'V5_012_002',
45             5.012001 => 'V5_012_001',
46             5.012 => 'V5_012_000',
47             5.010001 => 'V5_010_001',
48             5.01 => 'V5_010_000',
49             5.008009 => 'V5_008_009',
50             5.008008 => 'V5_008_008',
51             5.008007 => 'V5_008_007',
52             5.008006 => 'V5_008_006',
53             5.008005 => 'V5_008_005',
54             5.008004 => 'V5_008_004',
55             5.008003 => 'V5_008_003',
56             5.008002 => 'V5_008_002',
57             5.008001 => 'V5_008_001',
58             5.008 => 'V5_008_000',
59             5.006002 => 'V5_006_002',
60             5.006001 => 'V5_006_001',
61             5.006 => 'V5_006_000',
62             );
63              
64             our $NewestAPI = '5.022';
65             our $NewestStableAPI = '5.022';
66              
67             $Perls{'5.022000'} = $Perls{5.022};
68             $Perls{'5.020'} = $Perls{5.02};
69             $Perls{'5.020000'} = $Perls{5.02};
70             $Perls{'5.018000'} = $Perls{5.018};
71             $Perls{'5.016000'} = $Perls{5.016};
72             $Perls{'5.014000'} = $Perls{5.014};
73             $Perls{'5.012000'} = $Perls{5.012};
74             $Perls{'5.010000'} = $Perls{5.01};
75             $Perls{'5.010'} = $Perls{5.01};
76             $Perls{'5.008000'} = $Perls{5.008};
77             $Perls{'5.006000'} = $Perls{5.006};
78             #$Perls{'5.000'} = $Perls{5};
79              
80             sub _get_class_name {
81 48     48   69 my $class_or_self = shift;
82 48         81 my $version = shift;
83 48 50       222 return exists $Perls{$version} ? "Perl::APIReference::" . $Perls{$version} : undef;
84             }
85              
86             sub new {
87 48     48 1 61815 my $class = shift;
88 48         144 my %args = @_;
89 48         97 my $perl_version = $args{perl_version};
90 48 50       155 croak("Need perl_version")
91             if not defined $perl_version;
92 48 50       165 $perl_version = $NewestStableAPI if lc($perl_version) eq "newest";
93 48 50       114 $perl_version = $NewestAPI if lc($perl_version) eq "newest_devel";
94              
95 48         834 $perl_version = version->new($perl_version)->numify();
96             croak("Bad perl version '$perl_version'")
97 48 50       207 if not exists $Perls{$perl_version};
98              
99 48         154 my $classname = __PACKAGE__->_get_class_name($perl_version);
100 48         6930 eval "require $classname;";
101 48 50       209 croak("Bad perl version ($@)") if $@;
102              
103 48         254 return $classname->new(perl_version => $perl_version);
104             }
105              
106             sub as_yaml_calltips {
107 0     0 1   my $self = shift;
108              
109 0           my $index = $self->index();
110 0           my %toyaml;
111 0           foreach my $entry (keys %$index) {
112             my $yentry = {
113             cmd => '',
114             'exp' => $index->{$entry}{text},
115 0           };
116 0           $toyaml{$entry} = $yentry;
117             }
118 0           require YAML::Tiny;
119 0           return YAML::Tiny::Dump(\%toyaml);
120             }
121              
122             # only for ::Generator
123             sub _new_from_parse {
124 0     0     my $class = shift;
125              
126 0           return bless {@_} => $class;
127             }
128              
129             # only for ::Generator
130             sub _dump_as_class {
131 0     0     my $self = shift;
132 0           my $version = $self->perl_version;
133 0           my $classname = $self->_get_class_name($version);
134 0 0         if (not defined $classname) {
135 0           die "Can't determine class name for Perl version '$version'."
136             . " Do you need to add it to the list of supported versions first?";
137             }
138 0           my $file_name = $classname;
139 0           $file_name =~ s/^.*::([^:]+)$/$1.pm/;
140            
141 0           require Sereal::Encoder;
142 0           my $data = $self->{'index'};
143 0           my $dump = Sereal::Encoder->new({
144             compress => Sereal::Encoder::SRL_ZLIB(),
145             compress_level => 9,
146             dedupe_strings => 1,
147             })->encode($data);
148            
149 0 0         open my $fh, '>', $file_name or die $!;
150 0           binmode $fh;
151 0           print $fh <
152             package $classname;
153             use strict;
154             use warnings;
155             use Sereal::Decoder;
156             use parent 'Perl::APIReference';
157              
158             sub new {
159             my \$class = shift;
160             my \$pos = tell(*DATA);
161             binmode(*DATA);
162             local \$/ = undef;
163              
164             my \$data = ;
165             \$data =~ s/^\\s+//;
166              
167             my \$self = bless({
168             'index' => Sereal::Decoder::decode_sereal(\$data),
169             perl_version => '$version',
170             } => \$class);
171              
172             seek(*DATA, \$pos, 0);
173              
174             return \$self;
175             }
176              
177             1;
178              
179             HERE
180 0           print $fh "__DATA__\n";
181 0           print $fh $dump;
182             }
183              
184              
185             1;
186             __END__