xref: /openbsd-src/gnu/usr.bin/perl/cpan/experimental/lib/experimental.pm (revision 9f11ffb7133c203312a01e4b986886bc88c7d74b)
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