This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Params::Check 0.26
[perl5.git] / lib / feature.pm
... / ...
CommitLineData
1package feature;
2
3our $VERSION = '1.10';
4
5# (feature name) => (internal name, used in %^H)
6my %feature = (
7 switch => 'feature_switch',
8 say => "feature_say",
9 err => "feature_err",
10 state => "feature_state",
11);
12
13my %feature_bundle = (
14 "5.10.0" => [qw(switch say err state)],
15);
16# latest version here
17# keep it harcoded until we actually bump the version number to 5.10
18$feature_bundle{"5.10"} = $feature_bundle{"5.10.0"};
19#$feature_bundle{"5.10"} = $feature_bundle{sprintf("%vd",$^V)};
20
21# TODO:
22# - think about versioned features (use feature switch => 2)
23
24=head1 NAME
25
26feature - Perl pragma to enable new syntactic features
27
28=head1 SYNOPSIS
29
30 use feature qw(switch say);
31 given ($foo) {
32 when (1) { say "\$foo == 1" }
33 when ([2,3]) { say "\$foo == 2 || \$foo == 3" }
34 when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
35 when ($_ > 100) { say "\$foo > 100" }
36 default { say "None of the above" }
37 }
38
39=head1 DESCRIPTION
40
41It is usually impossible to add new syntax to Perl without breaking
42some existing programs. This pragma provides a way to minimize that
43risk. New syntactic constructs can be enabled by C<use feature 'foo'>,
44and will be parsed only when the appropriate feature pragma is in
45scope.
46
47=head2 Lexical effect
48
49Like other pragmas (C<use strict>, for example), features have a lexical
50effect. C<use feature qw(foo)> will only make the feature "foo" available
51from that point to the end of the enclosing block.
52
53 {
54 use feature 'say';
55 say "say is available here";
56 }
57 print "But not here.\n";
58
59=head2 C<no feature>
60
61Features can also be turned off by using C<no feature "foo">. This too
62has lexical effect.
63
64 use feature 'say';
65 say "say is available here";
66 {
67 no feature 'say';
68 print "But not here.\n";
69 }
70 say "Yet it is here.";
71
72C<no feature> with no features specified will turn off all features.
73
74=head2 The 'switch' feature
75
76C<use feature 'switch'> tells the compiler to enable the Perl 6
77given/when construct.
78
79See L<perlsyn/"Switch statements"> for details.
80
81=head2 The 'say' feature
82
83C<use feature 'say'> tells the compiler to enable the Perl 6
84C<say> function.
85
86See L<perlfunc/say> for details.
87
88=head2 the 'err' feature
89
90C<use feature 'err'> tells the compiler to enable the C<err>
91operator.
92
93C<err> is a low-precedence variant of the C<//> operator:
94see C<perlop> for details.
95
96=head2 the 'state' feature
97
98C<use feature 'state'> tells the compiler to enable C<state>
99variables.
100
101See L<perlsub/"Persistent Private Variables"> for details.
102
103=head1 FEATURE BUNDLES
104
105It's possible to load a whole slew of features in one go, using
106a I<feature bundle>. The name of a feature bundle is prefixed with
107a colon, to distinguish it from an actual feature. At present, the
108only feature bundles are C<use feature ":5.10"> and C<use feature ":5.10.0">,
109which both are equivalent to C<use feature qw(switch say err state)>.
110
111In the forthcoming 5.10.X perl releases, C<use feature ":5.10"> will be
112equivalent to the latest C<use feature ":5.10.X">.
113
114=cut
115
116sub import {
117 my $class = shift;
118 if (@_ == 0) {
119 croak("No features specified");
120 }
121 while (@_) {
122 my $name = shift(@_);
123 if ($name =~ /^:(.*)/) {
124 if (!exists $feature_bundle{$1}) {
125 unknown_feature_bundle($1);
126 }
127 unshift @_, @{$feature_bundle{$1}};
128 next;
129 }
130 if (!exists $feature{$name}) {
131 unknown_feature($name);
132 }
133 $^H{$feature{$name}} = 1;
134 }
135}
136
137sub unimport {
138 my $class = shift;
139
140 # A bare C<no feature> should disable *all* features
141 if (!@_) {
142 delete @^H{ values(%feature) };
143 return;
144 }
145
146 while (@_) {
147 my $name = shift;
148 if ($name =~ /^:(.*)/) {
149 if (!exists $feature_bundle{$1}) {
150 unknown_feature_bundle($1);
151 }
152 unshift @_, @{$feature_bundle{$1}};
153 next;
154 }
155 if (!exists($feature{$name})) {
156 unknown_feature($name);
157 }
158 else {
159 delete $^H{$feature{$name}};
160 }
161 }
162}
163
164sub unknown_feature {
165 my $feature = shift;
166 croak(sprintf('Feature "%s" is not supported by Perl %vd',
167 $feature, $^V));
168}
169
170sub unknown_feature_bundle {
171 my $feature = shift;
172 croak(sprintf('Feature bundle "%s" is not supported by Perl %vd',
173 $feature, $^V));
174}
175
176sub croak {
177 require Carp;
178 Carp::croak(@_);
179}
180
1811;