16fb12b70Safresh1package experimental; 2*9f11ffb7Safresh1$experimental::VERSION = '0.019'; 36fb12b70Safresh1use strict; 46fb12b70Safresh1use warnings; 5b8851fccSafresh1use version (); 66fb12b70Safresh1 7*9f11ffb7Safresh1BEGIN { eval { require feature } }; 86fb12b70Safresh1use Carp qw/croak carp/; 96fb12b70Safresh1 106fb12b70Safresh1my %warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::Offsets; 11b8851fccSafresh1my %features = map { $_ => 1 } $] > 5.015006 ? keys %feature::feature : do { 12b8851fccSafresh1 my @features; 13b8851fccSafresh1 if ($] >= 5.010) { 14b8851fccSafresh1 push @features, qw/switch say state/; 15b8851fccSafresh1 push @features, 'unicode_strings' if $] > 5.011002; 16b8851fccSafresh1 } 17b8851fccSafresh1 @features; 18b8851fccSafresh1}; 196fb12b70Safresh1 206fb12b70Safresh1my %min_version = ( 21b8851fccSafresh1 array_base => '5', 22b8851fccSafresh1 autoderef => '5.14.0', 23b8851fccSafresh1 bitwise => '5.22.0', 24*9f11ffb7Safresh1 const_attr => '5.22.0', 25b8851fccSafresh1 current_sub => '5.16.0', 26b8851fccSafresh1 evalbytes => '5.16.0', 27b8851fccSafresh1 fc => '5.16.0', 28b8851fccSafresh1 lexical_topic => '5.10.0', 29b8851fccSafresh1 lexical_subs => '5.18.0', 30b8851fccSafresh1 postderef => '5.20.0', 31b8851fccSafresh1 postderef_qq => '5.20.0', 32b8851fccSafresh1 refaliasing => '5.22.0', 33b8851fccSafresh1 regex_sets => '5.18.0', 34b8851fccSafresh1 say => '5.10.0', 35b8851fccSafresh1 smartmatch => '5.10.0', 36b8851fccSafresh1 signatures => '5.20.0', 37b8851fccSafresh1 state => '5.10.0', 38b8851fccSafresh1 switch => '5.10.0', 39b8851fccSafresh1 unicode_eval => '5.16.0', 40b8851fccSafresh1 unicode_strings => '5.12.0', 416fb12b70Safresh1); 42b8851fccSafresh1my %max_version = ( 43*9f11ffb7Safresh1 autoderef => '5.23.1', 44b8851fccSafresh1 lexical_topic => '5.23.4', 45b8851fccSafresh1); 46b8851fccSafresh1 47b8851fccSafresh1$_ = version->new($_) for values %min_version; 48b8851fccSafresh1$_ = version->new($_) for values %max_version; 496fb12b70Safresh1 506fb12b70Safresh1my %additional = ( 516fb12b70Safresh1 postderef => ['postderef_qq'], 526fb12b70Safresh1 switch => ['smartmatch'], 536fb12b70Safresh1); 546fb12b70Safresh1 556fb12b70Safresh1sub _enable { 566fb12b70Safresh1 my $pragma = shift; 576fb12b70Safresh1 if ($warnings{"experimental::$pragma"}) { 586fb12b70Safresh1 warnings->unimport("experimental::$pragma"); 596fb12b70Safresh1 feature->import($pragma) if exists $features{$pragma}; 606fb12b70Safresh1 _enable(@{ $additional{$pragma} }) if $additional{$pragma}; 616fb12b70Safresh1 } 626fb12b70Safresh1 elsif ($features{$pragma}) { 636fb12b70Safresh1 feature->import($pragma); 646fb12b70Safresh1 _enable(@{ $additional{$pragma} }) if $additional{$pragma}; 656fb12b70Safresh1 } 666fb12b70Safresh1 elsif (not exists $min_version{$pragma}) { 676fb12b70Safresh1 croak "Can't enable unknown feature $pragma"; 686fb12b70Safresh1 } 69b8851fccSafresh1 elsif ($] < $min_version{$pragma}) { 70b8851fccSafresh1 my $stable = $min_version{$pragma}; 71b8851fccSafresh1 if ($stable->{version}[1] % 2) { 72b8851fccSafresh1 $stable = version->new( 73b8851fccSafresh1 "5.".($stable->{version}[1]+1).'.0' 74b8851fccSafresh1 ); 75b8851fccSafresh1 } 76b8851fccSafresh1 croak "Need perl $stable or later for feature $pragma"; 77b8851fccSafresh1 } 78b8851fccSafresh1 elsif ($] >= ($max_version{$pragma} || 7)) { 79b8851fccSafresh1 croak "Experimental feature $pragma has been removed from perl in version $max_version{$pragma}"; 806fb12b70Safresh1 } 816fb12b70Safresh1} 826fb12b70Safresh1 836fb12b70Safresh1sub import { 846fb12b70Safresh1 my ($self, @pragmas) = @_; 856fb12b70Safresh1 866fb12b70Safresh1 for my $pragma (@pragmas) { 876fb12b70Safresh1 _enable($pragma); 886fb12b70Safresh1 } 896fb12b70Safresh1 return; 906fb12b70Safresh1} 916fb12b70Safresh1 926fb12b70Safresh1sub _disable { 936fb12b70Safresh1 my $pragma = shift; 946fb12b70Safresh1 if ($warnings{"experimental::$pragma"}) { 956fb12b70Safresh1 warnings->import("experimental::$pragma"); 966fb12b70Safresh1 feature->unimport($pragma) if exists $features{$pragma}; 976fb12b70Safresh1 _disable(@{ $additional{$pragma} }) if $additional{$pragma}; 986fb12b70Safresh1 } 996fb12b70Safresh1 elsif ($features{$pragma}) { 1006fb12b70Safresh1 feature->unimport($pragma); 1016fb12b70Safresh1 _disable(@{ $additional{$pragma} }) if $additional{$pragma}; 1026fb12b70Safresh1 } 1036fb12b70Safresh1 elsif (not exists $min_version{$pragma}) { 1046fb12b70Safresh1 carp "Can't disable unknown feature $pragma, ignoring"; 1056fb12b70Safresh1 } 1066fb12b70Safresh1} 1076fb12b70Safresh1 1086fb12b70Safresh1sub unimport { 1096fb12b70Safresh1 my ($self, @pragmas) = @_; 1106fb12b70Safresh1 1116fb12b70Safresh1 for my $pragma (@pragmas) { 1126fb12b70Safresh1 _disable($pragma); 1136fb12b70Safresh1 } 1146fb12b70Safresh1 return; 1156fb12b70Safresh1} 1166fb12b70Safresh1 1176fb12b70Safresh11; 1186fb12b70Safresh1 1196fb12b70Safresh1#ABSTRACT: Experimental features made easy 1206fb12b70Safresh1 1216fb12b70Safresh1__END__ 1226fb12b70Safresh1 1236fb12b70Safresh1=pod 1246fb12b70Safresh1 1256fb12b70Safresh1=encoding UTF-8 1266fb12b70Safresh1 1276fb12b70Safresh1=head1 NAME 1286fb12b70Safresh1 1296fb12b70Safresh1experimental - Experimental features made easy 1306fb12b70Safresh1 1316fb12b70Safresh1=head1 VERSION 1326fb12b70Safresh1 133*9f11ffb7Safresh1version 0.019 1346fb12b70Safresh1 1356fb12b70Safresh1=head1 SYNOPSIS 1366fb12b70Safresh1 1376fb12b70Safresh1 use experimental 'lexical_subs', 'smartmatch'; 1386fb12b70Safresh1 my sub foo { $_[0] ~~ 1 } 1396fb12b70Safresh1 1406fb12b70Safresh1=head1 DESCRIPTION 1416fb12b70Safresh1 1426fb12b70Safresh1This pragma provides an easy and convenient way to enable or disable 1436fb12b70Safresh1experimental features. 1446fb12b70Safresh1 1456fb12b70Safresh1Every version of perl has some number of features present but considered 1466fb12b70Safresh1"experimental." For much of the life of Perl 5, this was only a designation 1476fb12b70Safresh1found in the documentation. Starting in Perl v5.10.0, and more aggressively in 1486fb12b70Safresh1v5.18.0, experimental features were placed behind pragmata used to enable the 1496fb12b70Safresh1feature and disable associated warnings. 1506fb12b70Safresh1 1516fb12b70Safresh1The C<experimental> pragma exists to combine the required incantations into a 1526fb12b70Safresh1single interface stable across releases of perl. For every experimental 1536fb12b70Safresh1feature, this should enable the feature and silence warnings for the enclosing 1546fb12b70Safresh1lexical scope: 1556fb12b70Safresh1 1566fb12b70Safresh1 use experimental 'feature-name'; 1576fb12b70Safresh1 1586fb12b70Safresh1To disable the feature and, if applicable, re-enable any warnings, use: 1596fb12b70Safresh1 1606fb12b70Safresh1 no experimental 'feature-name'; 1616fb12b70Safresh1 1626fb12b70Safresh1The supported features, documented further below, are: 1636fb12b70Safresh1 164*9f11ffb7Safresh1=over 4 165*9f11ffb7Safresh1 166*9f11ffb7Safresh1=item * C<array_base> - allow the use of C<$[> to change the starting index of C<@array>. 167*9f11ffb7Safresh1 168*9f11ffb7Safresh1This is supported on all versions of perl. 169*9f11ffb7Safresh1 170*9f11ffb7Safresh1=item * C<autoderef> - allow push, each, keys, and other built-ins on references. 171*9f11ffb7Safresh1 172*9f11ffb7Safresh1This was added in perl 5.14.0 and removed in perl 5.23.1. 173*9f11ffb7Safresh1 174*9f11ffb7Safresh1=item * C<bitwise> - allow the new stringwise bit operators 175*9f11ffb7Safresh1 176*9f11ffb7Safresh1This was added in perl 5.22.0. 177*9f11ffb7Safresh1 178*9f11ffb7Safresh1=item * C<const_attr> - allow the :const attribute on subs 179*9f11ffb7Safresh1 180*9f11ffb7Safresh1This was added in perl 5.22.0. 181*9f11ffb7Safresh1 182*9f11ffb7Safresh1=item * C<lexical_topic> - allow the use of lexical C<$_> via C<my $_>. 183*9f11ffb7Safresh1 184*9f11ffb7Safresh1This was added in perl 5.10.0 and removed in perl 5.23.4. 185*9f11ffb7Safresh1 186*9f11ffb7Safresh1=item * C<lexical_subs> - allow the use of lexical subroutines. 187*9f11ffb7Safresh1 188*9f11ffb7Safresh1This was added in 5.18.0. 189*9f11ffb7Safresh1 190*9f11ffb7Safresh1=item * C<postderef> - allow the use of postfix dereferencing expressions, 191*9f11ffb7Safresh1including in interpolating strings 192*9f11ffb7Safresh1 193*9f11ffb7Safresh1This was added in perl 5.20.0. 194*9f11ffb7Safresh1 195*9f11ffb7Safresh1=item * C<re_strict> - enables strict mode in regular expressions 196*9f11ffb7Safresh1 197*9f11ffb7Safresh1This was added in perl 5.22.0. 198*9f11ffb7Safresh1 199*9f11ffb7Safresh1=item * C<refaliasing> - allow aliasing via C<\$x = \$y> 200*9f11ffb7Safresh1 201*9f11ffb7Safresh1This was added in perl 5.22.0. 202*9f11ffb7Safresh1 203*9f11ffb7Safresh1=item * C<regex_sets> - allow extended bracketed character classes in regexps 204*9f11ffb7Safresh1 205*9f11ffb7Safresh1This was added in perl 5.18.0. 206*9f11ffb7Safresh1 207*9f11ffb7Safresh1=item * C<signatures> - allow subroutine signatures (for named arguments) 208*9f11ffb7Safresh1 209*9f11ffb7Safresh1This was added in perl 5.20.0. 210*9f11ffb7Safresh1 211*9f11ffb7Safresh1=item * C<smartmatch> - allow the use of C<~~> 212*9f11ffb7Safresh1 213*9f11ffb7Safresh1This was added in perl 5.10.0, but it should be noted there are significant 214*9f11ffb7Safresh1incompatibilities between 5.10.0 and 5.10.1. 215*9f11ffb7Safresh1 216*9f11ffb7Safresh1=item * C<switch> - allow the use of C<~~>, given, and when 217*9f11ffb7Safresh1 218*9f11ffb7Safresh1This was added in perl 5.10.0. 219*9f11ffb7Safresh1 220*9f11ffb7Safresh1=item * C<win32_perlio> - allows the use of the :win32 IO layer. 221*9f11ffb7Safresh1 222*9f11ffb7Safresh1This was added on perl 5.22.0. 223*9f11ffb7Safresh1 224*9f11ffb7Safresh1=back 225b8851fccSafresh1 226b8851fccSafresh1=head2 Ordering matters 227b8851fccSafresh1 228b8851fccSafresh1Using this pragma to 'enable an experimental feature' is another way of saying 229b8851fccSafresh1that this pragma will disable the warnings which would result from using that 230b8851fccSafresh1feature. Therefore, the order in which pragmas are applied is important. In 231b8851fccSafresh1particular, you probably want to enable experimental features I<after> you 232b8851fccSafresh1enable warnings: 233b8851fccSafresh1 234b8851fccSafresh1 use warnings; 235b8851fccSafresh1 use experimental 'smartmatch'; 236b8851fccSafresh1 237b8851fccSafresh1You also need to take care with modules that enable warnings for you. A common 238b8851fccSafresh1example being Moose. In this example, warnings for the 'smartmatch' feature are 239b8851fccSafresh1first turned on by the warnings pragma, off by the experimental pragma and back 240b8851fccSafresh1on again by the Moose module (fix is to switch the last two lines): 241b8851fccSafresh1 242b8851fccSafresh1 use warnings; 243b8851fccSafresh1 use experimental 'smartmatch'; 244b8851fccSafresh1 use Moose; 2456fb12b70Safresh1 2466fb12b70Safresh1=head2 Disclaimer 2476fb12b70Safresh1 2486fb12b70Safresh1Because of the nature of the features it enables, forward compatibility can not 2496fb12b70Safresh1be guaranteed in any way. 2506fb12b70Safresh1 251*9f11ffb7Safresh1=head1 SEE ALSO 252*9f11ffb7Safresh1 253*9f11ffb7Safresh1L<perlexperimental|perlexperimental> contains more information about experimental features. 254*9f11ffb7Safresh1 2556fb12b70Safresh1=head1 AUTHOR 2566fb12b70Safresh1 2576fb12b70Safresh1Leon Timmermans <leont@cpan.org> 2586fb12b70Safresh1 2596fb12b70Safresh1=head1 COPYRIGHT AND LICENSE 2606fb12b70Safresh1 2616fb12b70Safresh1This software is copyright (c) 2013 by Leon Timmermans. 2626fb12b70Safresh1 2636fb12b70Safresh1This is free software; you can redistribute it and/or modify it under 2646fb12b70Safresh1the same terms as the Perl 5 programming language system itself. 2656fb12b70Safresh1 2666fb12b70Safresh1=cut 267