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