package feature;
-our $VERSION = '1.00';
-$feature::hint_bits = 0x04020000; # HINT_LOCALIZE_HH | HINT_HH_FOR_EVAL
+our $VERSION = '1.01';
# (feature name) => (internal name, used in %^H)
my %feature = (
- switch => 'switch',
- "~~" => "~~",
- say => "say",
+ switch => 'feature_switch',
+ "~~" => "feature_~~",
+ say => "feature_say",
+ err => "feature_err",
+ state => "feature_state",
+);
+
+my %feature_bundle = (
+ "5.10" => [qw(switch ~~ say err state)],
);
=head1 SYNOPSIS
- use feature 'switch';
+ use feature qw(switch say);
given ($foo) {
- when (1) { print "\$foo == 1\n" }
- when ([2,3]) { print "\$foo == 2 || \$foo == 3\n" }
- when (/^a[bc]d$/) { print "\$foo eq 'abd' || \$foo eq 'acd'\n" }
- when ($_ > 100) { print "\$foo > 100\n" }
- default { print "None of the above\n" }
+ when (1) { say "\$foo == 1" }
+ when ([2,3]) { say "\$foo == 2 || \$foo == 3" }
+ when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
+ when ($_ > 100) { say "\$foo > 100" }
+ default { say "None of the above" }
}
=head1 DESCRIPTION
See L<perlfunc/say> for details.
+=head2 the 'err' feature
+
+C<use feature 'err'> tells the compiler to enable the C<err>
+operator from here to the end of the enclosing BLOCK.
+
+C<err> is a low-precedence variant of the C<//> operator:
+see C<perlop> for details.
+
+=head2 the 'state' feature
+
+C<use feature 'state'> tells the compiler to enable C<state>
+variables from here to the end of the enclosing BLOCK.
+
+=head1 FEATURE BUNDLES
+
+It's possible to load a whole slew of features in one go, using
+a I<feature bundle>. The name of a feature bundle is prefixed with
+a colon, to distinguish it from an actual feature. At present, the
+only feature bundle is C<use feature ":5.10">, which is equivalent
+to C<use feature qw(switch ~~ say err state)>.
+
=cut
sub import {
- $^H |= $feature::hint_bits; # Need this or %^H won't work
-
my $class = shift;
if (@_ == 0) {
require Carp;
}
while (@_) {
my $name = shift(@_);
+ if ($name =~ /^:(.*)/) {
+ if (!exists $feature_bundle{$1}) {
+ require Carp;
+ Carp->import("croak");
+ croak(sprintf('Feature bundle "%s" is not supported by Perl %vd',
+ $1, $^V));
+ }
+ unshift @_, @{$feature_bundle{$1}};
+ next;
+ }
if (!exists $feature{$name}) {
require Carp;
Carp->import("croak");
my $class = shift;
# A bare C<no feature> should disable *all* features
- for my $name (@_) {
+ if (!@_) {
+ delete @^H{ values(%feature) };
+ return;
+ }
+
+ while (@_) {
+ my $name = shift;
+ if ($name =~ /^:(.*)/) {
+ if (!exists $feature_bundle{$1}) {
+ require Carp;
+ Carp->import("croak");
+ croak(sprintf('Feature bundle "%s" is not supported by Perl %vd',
+ $1, $^V));
+ }
+ unshift @_, @{$feature_bundle{$1}};
+ next;
+ }
if (!exists($feature{$name})) {
require Carp;
Carp->import("croak");
delete $^H{$feature{$name}};
}
}
-
- if(!@_) {
- delete @^H{ values(%feature) };
- }
}
1;