File Coverage

blib/lib/Perl/Modern/Perl.pm
Criterion Covered Total %
statement 57 77 74.0
branch 8 24 33.3
condition n/a
subroutine 10 11 90.9
pod n/a
total 75 112 66.9


line stmt bran cond sub pod time code
1             # ##############################################################################
2             # # Script : Perl::Modern::Perl #
3             # # -------------------------------------------------------------------------- #
4             # # Copyright : Frei unter GNU General Public License bzw. Artistic License #
5             # # Authors : JVBSOFT - Jürgen von Brietzke 0.001 - 1.007 #
6             # # Version : 1.007 21.Dez.2015 #
7             # # -------------------------------------------------------------------------- #
8             # # Function : Lädt alle Features der aktuellen benutzten Perl-Version. #
9             # # -------------------------------------------------------------------------- #
10             # # Language : PERL 5 (V) 5.12.xx - 5.22.xx #
11             # # Coding : ISO 8859-15 / Latin-9 UNIX-Zeilenende #
12             # # Standards : Perl-Best-Practices severity 1 (brutal) #
13             # # -------------------------------------------------------------------------- #
14             # # Pragmas : feature, mro, strict, version, warnings #
15             # # -------------------------------------------------------------------------- #
16             # # Module : Carp ActivePerl-CORE-Module #
17             # # English #
18             # # ------------------------------------------------------------- #
19             # # Perl::Version ActivePerl-REPO-Module #
20             # ##############################################################################
21            
22             package Perl::Modern::Perl 1.007;
23            
24             # ##############################################################################
25            
26 2     2   38071 use 5.012;
  2         8  
27            
28 2     2   12 use feature ();
  2         4  
  2         28  
29 2     2   1539 use mro ();
  2         3160  
  2         59  
30 2     2   14 use strict;
  2         4  
  2         43  
31 2     2   1627 use version;
  2         4176  
  2         13  
32 2     2   137 use warnings;
  2         5  
  2         56  
33            
34 2     2   11 use Carp;
  2         3  
  2         171  
35 2     2   1866 use English qw{-no_match_vars};
  2         9848  
  2         11  
36 2     2   2826 use Perl::Version;
  2         10545  
  2         1846  
37            
38             # ##############################################################################
39             # # Feature/Warnings-Table : Enthaelt alle verfuegbaren Features bis Perl 5.22 #
40             # # -------------------------------------------------------------------------- #
41             # # 5.xx <-> Feature ist im Feature-Tag enthalten ( ':5.xx' ) #
42             # # ++++ <-> Feature ist in der Perl-Version zuschaltbar #
43             # # ---- <-> Feature ist in der Perl-Version nicht implementiert #
44             # ##############################################################################
45            
46             our %FEATURES = (
47             # ------ Perl-Version ----- 5.10 5.12 5.14 5.16 5.18 5.20 5.22 -----------------
48             array_base => [ qw( 5.10 5.12 5.14 ++++ ++++ ++++ ++++ ) ],
49             bitwise => [ qw( ---- ---- ---- ---- ---- ---- ++++ ) ],
50             current_sub => [ qw( ---- ---- ---- 5.16 5.18 5.20 5.22 ) ],
51             evalbytes => [ qw( ---- ---- ---- 5.16 5.18 5.20 5.22 ) ],
52             fc => [ qw( ---- ---- ---- 5.16 5.18 5.20 5.22 ) ],
53             lexical_subs => [ qw( ---- ---- ---- ---- ++++ ++++ ++++ ) ],
54             postderef => [ qw( ---- ---- ---- ---- ---- ++++ ++++ ) ],
55             postderef_qq => [ qw( ---- ---- ---- ---- ---- ++++ ++++ ) ],
56             refaliasing => [ qw( ---- ---- ---- ---- ---- ---- ++++ ) ],
57             say => [ qw( 5.10 5.12 5.14 5.16 5.18 5.20 5.22 ) ],
58             signatures => [ qw( ---- ---- ---- ---- ---- ++++ ++++ ) ],
59             state => [ qw( 5.10 5.12 5.14 5.16 5.18 5.20 5.22 ) ],
60             switch => [ qw( 5.10 5.12 5.14 5.16 5.18 5.20 5.22 ) ],
61             unicode_eval => [ qw( ---- ---- ---- 5.16 5.18 5.20 5.22 ) ],
62             unicode_strings => [ qw( ---- 5.12 5.14 5.16 5.18 5.20 5.22 ) ],
63             );
64            
65             our %WARNINGS = (
66             # ----- Perl-Version ------ 5.10 5.12 5.14 5.16 5.18 5.20 5.22 -----------------
67             autoderef => [ qw( ---- ---- ---- ---- ---- 5.20 5.22 ) ],
68             bitwise => [ qw( ---- ---- ---- ---- ---- ---- 5.22 ) ],
69             const_attr => [ qw( ---- ---- ---- ---- ---- ---- 5.22 ) ],
70             lexical_subs => [ qw( ---- ---- ---- ---- 5.18 5.20 5.22 ) ],
71             lexical_topic => [ qw( ---- ---- ---- ---- 5.18 5.20 5.22 ) ],
72             postderef => [ qw( ---- ---- ---- ---- ---- 5.20 5.22 ) ],
73             re_strict => [ qw( ---- ---- ---- ---- ---- ---- 5.22 ) ],
74             refaliasing => [ qw( ---- ---- ---- ---- ---- ---- 5.22 ) ],
75             regex_sets => [ qw( ---- ---- ---- ---- 5.18 5.20 5.22 ) ],
76             signatures => [ qw( ---- ---- ---- ---- ---- 5.20 5.22 ) ],
77             smartmatch => [ qw( ---- ---- ---- ---- 5.18 5.20 5.22 ) ],
78             );
79            
80             # ##############################################################################
81             # # Aufgabe | Importiert die experimentellen Features einer Perl-Version. #
82             # # ----------+ -------------------------------------------------------------- #
83             # # Aufruf | use Perl::Features qw( [ 5.22 [ say [ -state ... ] ] ] ); #
84             # # | -------------------------------------------------------------- #
85             # # | Importiert alle Featurs von Perl 5.22 ausser 'say' und 'state. #
86             # # ----------+--------------------------------------------------------------- #
87             # # Rückgabe | keine #
88             # ##############################################################################
89            
90             sub import {
91            
92 1     1   14 my ( $class, $version, @delete_features_or_warnings ) = @ARG;
93            
94 1         2 my ( $actual_perl_version, $use_perl_version, $version_tag, $version_idx );
95            
96             # --- Aktuelle PERL-Version bestimmen und Feature-Tag bilden ----------------
97 1 50       46 if ( $PERL_VERSION =~ /^v5[.](\d\d).+$/smx ) {
98 1         4 $actual_perl_version = "5.$1";
99 1         3 $use_perl_version = "5.0$1";
100             }
101             else {
102 0         0 confess "Version '$PERL_VERSION' not detected\n";
103             }
104            
105             # --- Versions-String pruefen und Feature-Tag bilden ------------------------
106 1 50       6 if ( not $version ) {
107 1         1 $version = $actual_perl_version;
108             }
109 1 50       5 if ( $version =~ /^5[.](1[02468]|2[02])$/ismx ) {
110 1         3 $use_perl_version = "5.0$1";
111 1         15 $version_idx = $1 / 2 - 5;
112 1         2 $version_tag = ":$version";
113             }
114             else {
115 0         0 confess "Version ($version) not supports\n";
116             }
117            
118             # --- Testen ob die aktuelle PERL-Version groesser gleich Feature-Version ---
119 1         5 my $perl_version = Perl::Version->new($actual_perl_version);
120 1         103 my $feature_version = Perl::Version->new($version);
121 1 50       62 if ( $perl_version < $feature_version ) {
122 0         0 confess "Features '$version' in '$actual_perl_version' not available\n";
123             }
124            
125             # --- PERL-Version aktivieren und Features importieren ----------------------
126 1         37 my $use = "use qw{$use_perl_version}";
127 1 50       2 eval { $use } or confess "Can't execute '$use'\n";
  1         5  
128 1         17 warnings->import;
129 1         6 strict->import;
130 1         6 version->import;
131 1         1244 feature->import( $version_tag );
132 1         6 mro::set_mro( scalar caller(), 'c3' );
133            
134             # --- Zusatz-Features importieren -------------------------------------------
135 1         4 foreach my $feature ( keys %FEATURES ) {
136 15 100       36 if ( $FEATURES{$feature}->[$version_idx] eq '++++' ) {
137 7         60 feature->import($feature);
138             }
139             }
140            
141             # --- Warnmeldung fuer importierte Features ausschalten ---------------------
142 1         4 foreach my $warning ( keys %WARNINGS ) {
143 11 50       29 if ( $WARNINGS{$warning}->[$version_idx] ne '----' ) {
144 11         99 warnings->unimport( "experimental::$warning" );
145             }
146             }
147            
148             # --- Einzelne Features entfernen / einzelne Warnungen einschalten ----------
149 1         3 my $flag;
150 1         2 foreach my $delete ( @delete_features_or_warnings ) {
151 0         0 $flag = 0;
152 0         0 $delete =~ s/^[-+](.+)/$1/smx;
153 0 0       0 if ( exists $FEATURES{$delete} ) {
154 0         0 $flag = 1;
155 0 0       0 if ( $FEATURES{$delete}->[$version_idx] ne '----' ) {
156 0         0 feature->unimport($delete);
157             }
158             else {
159 0         0 confess "Feature '$delete' in version '$version' not available\n"
160             }
161             }
162 0 0       0 if ( exists $WARNINGS{$delete} ) {
163 0         0 $flag = 1;
164 0 0       0 if ( $WARNINGS{$delete}->[$version_idx] ne '----' ) {
165 0         0 warnings->import( "experimental::$delete" );
166             }
167             }
168 0 0       0 if ( not $flag ) {
169 0         0 confess "Unknown feature/warning for delete '$delete'\n";
170             }
171             }
172            
173 1         59 return;
174            
175             }
176            
177             # ##############################################################################
178             # # Aufgabe | Entfernt alle experimentellen Features einer Perl-Version. #
179             # # ----------+ -------------------------------------------------------------- #
180             # # Rückgabe | keine #
181             # ##############################################################################
182            
183             sub unimport {
184            
185 0     0     warnings->unimport;
186 0           strict->unimport;
187 0           feature->unimport;
188            
189 0           return;
190            
191             }
192            
193             # ##############################################################################
194             # # E N D E #
195             # ##############################################################################
196             1;
197             __END__