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