xref: /openbsd-src/gnu/usr.bin/perl/lib/overloading.pm (revision 43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f)
1*43003dfeSmillertpackage overloading;
2*43003dfeSmillertuse warnings;
3*43003dfeSmillert
4*43003dfeSmillertuse Carp ();
5*43003dfeSmillert
6*43003dfeSmillertour $VERSION = '0.01';
7*43003dfeSmillert
8*43003dfeSmillertmy $HINT_NO_AMAGIC = 0x01000000; # see perl.h
9*43003dfeSmillert
10*43003dfeSmillertrequire 5.010001;
11*43003dfeSmillert
12*43003dfeSmillertsub _ops_to_nums {
13*43003dfeSmillert    require overload::numbers;
14*43003dfeSmillert
15*43003dfeSmillert    map { exists $overload::numbers::names{"($_"}
16*43003dfeSmillert	? $overload::numbers::names{"($_"}
17*43003dfeSmillert	: Carp::croak("'$_' is not a valid overload")
18*43003dfeSmillert    } @_;
19*43003dfeSmillert}
20*43003dfeSmillert
21*43003dfeSmillertsub import {
22*43003dfeSmillert    my ( $class, @ops ) = @_;
23*43003dfeSmillert
24*43003dfeSmillert    if ( @ops ) {
25*43003dfeSmillert	if ( $^H{overloading} ) {
26*43003dfeSmillert	    vec($^H{overloading} , $_, 1) = 0 for _ops_to_nums(@ops);
27*43003dfeSmillert	}
28*43003dfeSmillert
29*43003dfeSmillert	if ( $^H{overloading} !~ /[^\0]/ ) {
30*43003dfeSmillert	    delete $^H{overloading};
31*43003dfeSmillert	    $^H &= ~$HINT_NO_AMAGIC;
32*43003dfeSmillert	}
33*43003dfeSmillert    } else {
34*43003dfeSmillert	delete $^H{overloading};
35*43003dfeSmillert	$^H &= ~$HINT_NO_AMAGIC;
36*43003dfeSmillert    }
37*43003dfeSmillert}
38*43003dfeSmillert
39*43003dfeSmillertsub unimport {
40*43003dfeSmillert    my ( $class, @ops ) = @_;
41*43003dfeSmillert
42*43003dfeSmillert    if ( exists $^H{overloading} or not $^H & $HINT_NO_AMAGIC ) {
43*43003dfeSmillert	if ( @ops ) {
44*43003dfeSmillert	    vec($^H{overloading} ||= '', $_, 1) = 1 for _ops_to_nums(@ops);
45*43003dfeSmillert	} else {
46*43003dfeSmillert	    delete $^H{overloading};
47*43003dfeSmillert	}
48*43003dfeSmillert    }
49*43003dfeSmillert
50*43003dfeSmillert    $^H |= $HINT_NO_AMAGIC;
51*43003dfeSmillert}
52*43003dfeSmillert
53*43003dfeSmillert1;
54*43003dfeSmillert__END__
55*43003dfeSmillert
56*43003dfeSmillert=head1 NAME
57*43003dfeSmillert
58*43003dfeSmillertoverloading - perl pragma to lexically control overloading
59*43003dfeSmillert
60*43003dfeSmillert=head1 SYNOPSIS
61*43003dfeSmillert
62*43003dfeSmillert    {
63*43003dfeSmillert	no overloading;
64*43003dfeSmillert	my $str = "$object"; # doesn't call stringification overload
65*43003dfeSmillert    }
66*43003dfeSmillert
67*43003dfeSmillert    # it's lexical, so this stringifies:
68*43003dfeSmillert    warn "$object";
69*43003dfeSmillert
70*43003dfeSmillert    # it can be enabled per op
71*43003dfeSmillert    no overloading qw("");
72*43003dfeSmillert    warn "$object";
73*43003dfeSmillert
74*43003dfeSmillert    # and also reenabled
75*43003dfeSmillert    use overloading;
76*43003dfeSmillert
77*43003dfeSmillert=head1 DESCRIPTION
78*43003dfeSmillert
79*43003dfeSmillertThis pragma allows you to lexically disable or enable overloading.
80*43003dfeSmillert
81*43003dfeSmillert=over 6
82*43003dfeSmillert
83*43003dfeSmillert=item C<no overloading>
84*43003dfeSmillert
85*43003dfeSmillertDisables overloading entirely in the current lexical scope.
86*43003dfeSmillert
87*43003dfeSmillert=item C<no overloading @ops>
88*43003dfeSmillert
89*43003dfeSmillertDisables only specific overloads in the current lexical scope.
90*43003dfeSmillert
91*43003dfeSmillert=item C<use overloading>
92*43003dfeSmillert
93*43003dfeSmillertReenables overloading in the current lexical scope.
94*43003dfeSmillert
95*43003dfeSmillert=item C<use overloading @ops>
96*43003dfeSmillert
97*43003dfeSmillertReenables overloading only for specific ops in the current lexical scope.
98*43003dfeSmillert
99*43003dfeSmillert=back
100*43003dfeSmillert
101*43003dfeSmillert=cut
102