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