xref: /openbsd-src/gnu/usr.bin/perl/lib/overloading.pm (revision 898184e3e61f9129feb5978fad5a8c6865f00b92)
143003dfeSmillertpackage overloading;
243003dfeSmillertuse warnings;
343003dfeSmillert
4*898184e3Ssthenour $VERSION = '0.02';
543003dfeSmillert
643003dfeSmillertmy $HINT_NO_AMAGIC = 0x01000000; # see perl.h
743003dfeSmillert
843003dfeSmillertrequire 5.010001;
943003dfeSmillert
1043003dfeSmillertsub _ops_to_nums {
1143003dfeSmillert    require overload::numbers;
1243003dfeSmillert
1343003dfeSmillert    map { exists $overload::numbers::names{"($_"}
1443003dfeSmillert	? $overload::numbers::names{"($_"}
15*898184e3Ssthen	: do { require Carp; Carp::croak("'$_' is not a valid overload") }
1643003dfeSmillert    } @_;
1743003dfeSmillert}
1843003dfeSmillert
1943003dfeSmillertsub import {
2043003dfeSmillert    my ( $class, @ops ) = @_;
2143003dfeSmillert
2243003dfeSmillert    if ( @ops ) {
2343003dfeSmillert	if ( $^H{overloading} ) {
2443003dfeSmillert	    vec($^H{overloading} , $_, 1) = 0 for _ops_to_nums(@ops);
2543003dfeSmillert	}
2643003dfeSmillert
2743003dfeSmillert	if ( $^H{overloading} !~ /[^\0]/ ) {
2843003dfeSmillert	    delete $^H{overloading};
2943003dfeSmillert	    $^H &= ~$HINT_NO_AMAGIC;
3043003dfeSmillert	}
3143003dfeSmillert    } else {
3243003dfeSmillert	delete $^H{overloading};
3343003dfeSmillert	$^H &= ~$HINT_NO_AMAGIC;
3443003dfeSmillert    }
3543003dfeSmillert}
3643003dfeSmillert
3743003dfeSmillertsub unimport {
3843003dfeSmillert    my ( $class, @ops ) = @_;
3943003dfeSmillert
4043003dfeSmillert    if ( exists $^H{overloading} or not $^H & $HINT_NO_AMAGIC ) {
4143003dfeSmillert	if ( @ops ) {
4243003dfeSmillert	    vec($^H{overloading} ||= '', $_, 1) = 1 for _ops_to_nums(@ops);
4343003dfeSmillert	} else {
4443003dfeSmillert	    delete $^H{overloading};
4543003dfeSmillert	}
4643003dfeSmillert    }
4743003dfeSmillert
4843003dfeSmillert    $^H |= $HINT_NO_AMAGIC;
4943003dfeSmillert}
5043003dfeSmillert
5143003dfeSmillert1;
5243003dfeSmillert__END__
5343003dfeSmillert
5443003dfeSmillert=head1 NAME
5543003dfeSmillert
5643003dfeSmillertoverloading - perl pragma to lexically control overloading
5743003dfeSmillert
5843003dfeSmillert=head1 SYNOPSIS
5943003dfeSmillert
6043003dfeSmillert    {
6143003dfeSmillert	no overloading;
6243003dfeSmillert	my $str = "$object"; # doesn't call stringification overload
6343003dfeSmillert    }
6443003dfeSmillert
6543003dfeSmillert    # it's lexical, so this stringifies:
6643003dfeSmillert    warn "$object";
6743003dfeSmillert
6843003dfeSmillert    # it can be enabled per op
6943003dfeSmillert    no overloading qw("");
7043003dfeSmillert    warn "$object";
7143003dfeSmillert
7243003dfeSmillert    # and also reenabled
7343003dfeSmillert    use overloading;
7443003dfeSmillert
7543003dfeSmillert=head1 DESCRIPTION
7643003dfeSmillert
7743003dfeSmillertThis pragma allows you to lexically disable or enable overloading.
7843003dfeSmillert
7943003dfeSmillert=over 6
8043003dfeSmillert
8143003dfeSmillert=item C<no overloading>
8243003dfeSmillert
8343003dfeSmillertDisables overloading entirely in the current lexical scope.
8443003dfeSmillert
8543003dfeSmillert=item C<no overloading @ops>
8643003dfeSmillert
8743003dfeSmillertDisables only specific overloads in the current lexical scope.
8843003dfeSmillert
8943003dfeSmillert=item C<use overloading>
9043003dfeSmillert
9143003dfeSmillertReenables overloading in the current lexical scope.
9243003dfeSmillert
9343003dfeSmillert=item C<use overloading @ops>
9443003dfeSmillert
9543003dfeSmillertReenables overloading only for specific ops in the current lexical scope.
9643003dfeSmillert
9743003dfeSmillert=back
9843003dfeSmillert
9943003dfeSmillert=cut
100