summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/perl/lib/overloading.pm
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2009-10-12 18:10:27 +0000
committermillert <millert@openbsd.org>2009-10-12 18:10:27 +0000
commit43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f (patch)
tree1abc677556fd1cb82189030802130c0f670a32d9 /gnu/usr.bin/perl/lib/overloading.pm
parentMore inodes by default on the ramdisk, because otherwise a many-disk (diff)
downloadwireguard-openbsd-43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f.tar.xz
wireguard-openbsd-43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f.zip
import perl 5.10.1
Diffstat (limited to 'gnu/usr.bin/perl/lib/overloading.pm')
-rw-r--r--gnu/usr.bin/perl/lib/overloading.pm101
1 files changed, 101 insertions, 0 deletions
diff --git a/gnu/usr.bin/perl/lib/overloading.pm b/gnu/usr.bin/perl/lib/overloading.pm
new file mode 100644
index 00000000000..d1ca5664b6c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/overloading.pm
@@ -0,0 +1,101 @@
+package overloading;
+use warnings;
+
+use Carp ();
+
+our $VERSION = '0.01';
+
+my $HINT_NO_AMAGIC = 0x01000000; # see perl.h
+
+require 5.010001;
+
+sub _ops_to_nums {
+ require overload::numbers;
+
+ map { exists $overload::numbers::names{"($_"}
+ ? $overload::numbers::names{"($_"}
+ : Carp::croak("'$_' is not a valid overload")
+ } @_;
+}
+
+sub import {
+ my ( $class, @ops ) = @_;
+
+ if ( @ops ) {
+ if ( $^H{overloading} ) {
+ vec($^H{overloading} , $_, 1) = 0 for _ops_to_nums(@ops);
+ }
+
+ if ( $^H{overloading} !~ /[^\0]/ ) {
+ delete $^H{overloading};
+ $^H &= ~$HINT_NO_AMAGIC;
+ }
+ } else {
+ delete $^H{overloading};
+ $^H &= ~$HINT_NO_AMAGIC;
+ }
+}
+
+sub unimport {
+ my ( $class, @ops ) = @_;
+
+ if ( exists $^H{overloading} or not $^H & $HINT_NO_AMAGIC ) {
+ if ( @ops ) {
+ vec($^H{overloading} ||= '', $_, 1) = 1 for _ops_to_nums(@ops);
+ } else {
+ delete $^H{overloading};
+ }
+ }
+
+ $^H |= $HINT_NO_AMAGIC;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+overloading - perl pragma to lexically control overloading
+
+=head1 SYNOPSIS
+
+ {
+ no overloading;
+ my $str = "$object"; # doesn't call stringification overload
+ }
+
+ # it's lexical, so this stringifies:
+ warn "$object";
+
+ # it can be enabled per op
+ no overloading qw("");
+ warn "$object";
+
+ # and also reenabled
+ use overloading;
+
+=head1 DESCRIPTION
+
+This pragma allows you to lexically disable or enable overloading.
+
+=over 6
+
+=item C<no overloading>
+
+Disables overloading entirely in the current lexical scope.
+
+=item C<no overloading @ops>
+
+Disables only specific overloads in the current lexical scope.
+
+=item C<use overloading>
+
+Reenables overloading in the current lexical scope.
+
+=item C<use overloading @ops>
+
+Reenables overloading only for specific ops in the current lexical scope.
+
+=back
+
+=cut