+$strict::VERSION = "1.11";
+
+my ( %bitmask, %explicit_bitmask );
+
+BEGIN {
+ # Verify that we're called correctly so that strictures will work.
+ # Can't use Carp, since Carp uses us!
+ # see also warnings.pm.
+ die sprintf "Incorrect use of pragma '%s' at %s line %d.\n", __PACKAGE__, +(caller)[1,2]
+ if __FILE__ !~ ( '(?x) \b '.__PACKAGE__.' \.pmc? \z' )
+ && __FILE__ =~ ( '(?x) \b (?i:'.__PACKAGE__.') \.pmc? \z' );
+
+ %bitmask = (
+ refs => 0x00000002,
+ subs => 0x00000200,
+ vars => 0x00000400,
+ );
+
+ %explicit_bitmask = (
+ refs => 0x00000020,
+ subs => 0x00000040,
+ vars => 0x00000080,
+ );
+
+ my $bits = 0;
+ $bits |= $_ for values %bitmask;
+
+ my $inline_all_bits = $bits;
+ *all_bits = sub () { $inline_all_bits };
+
+ $bits = 0;
+ $bits |= $_ for values %explicit_bitmask;
+
+ my $inline_all_explicit_bits = $bits;
+ *all_explicit_bits = sub () { $inline_all_explicit_bits };
+}
+
+sub bits {
+ my $bits = 0;
+ my @wrong;
+ foreach my $s (@_) {
+ if (exists $bitmask{$s}) {
+ $^H |= $explicit_bitmask{$s};
+
+ $bits |= $bitmask{$s};
+ }
+ else {
+ push @wrong, $s;
+ }
+ }
+ if (@wrong) {
+ require Carp;
+ Carp::croak("Unknown 'strict' tag(s) '@wrong'");
+ }
+ $bits;
+}
+
+sub import {
+ shift;
+ $^H |= @_ ? &bits : all_bits | all_explicit_bits;
+}
+
+sub unimport {
+ shift;
+
+ if (@_) {
+ $^H &= ~&bits;
+ }
+ else {
+ $^H &= ~all_bits;
+ $^H |= all_explicit_bits;
+ }
+}
+
+1;
+__END__
+