X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Ffeature.pm;h=240d46dc467ae95d81c63bcf4f4e44c22f74f352;hb=cdfe229e642682dd52e04cdd1232a90648b35fe3;hp=e0981d08a9a6305e633f0ff4febd32730019bf7d;hpb=0d863452f5cac86322a90184dc68dbf446006ed7;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/feature.pm b/lib/feature.pm index e0981d0..240d46d 100644 --- a/lib/feature.pm +++ b/lib/feature.pm @@ -1,13 +1,18 @@ 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)], ); @@ -31,13 +36,13 @@ feature - Perl pragma to enable new syntactic features =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 @@ -69,11 +74,30 @@ C function from here to the end of the enclosing BLOCK. See L for details. +=head2 the 'err' feature + +C tells the compiler to enable the C +operator from here to the end of the enclosing BLOCK. + +C is a low-precedence variant of the C operator: +see C for details. + +=head2 the 'state' feature + +C tells the compiler to enable C +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. 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, which is equivalent +to C. + =cut sub import { - $^H |= $feature::hint_bits; # Need this or %^H won't work - my $class = shift; if (@_ == 0) { require Carp; @@ -82,6 +106,16 @@ sub import { } 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"); @@ -96,7 +130,23 @@ sub unimport { my $class = shift; # A bare C 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"); @@ -107,10 +157,6 @@ sub unimport { delete $^H{$feature{$name}}; } } - - if(!@_) { - delete @^H{ values(%feature) }; - } } 1;