package Ruby::literal; use strict; use warnings; use Carp (); require Ruby; require overload; my %Typemap = ( q => \&Ruby::_string_handler, integer => \&Ruby::_integer_handler, binary => \&Ruby::_integer_handler, float => \&Ruby::_float_handler, ); sub typemap { if(@_){ my %t; for my $h(@_){ if($h eq 'string'){ $t{q} = $Typemap{q}; } elsif($h eq 'integer'){ $t{integer} = $Typemap{integer}; $t{binary} = $Typemap{binary}; } elsif($h eq 'float'){ $t{float} = $Typemap{float}; } elsif($h eq 'numeric'){ $t{integer} = $Typemap{integer}; $t{binary} = $Typemap{binary}; $t{float} = $Typemap{float}; } elsif($h eq 'all'){ return %Typemap; } else{ Carp::croak(qq{Unknown overload handler "$h"}); } } return %t; } else{ return %Typemap; } } sub import{ shift; overload::constant( typemap(@_) ); } sub unimport{ shift; overload::remove_constant( typemap(@_) ); } 1;