=== autobox.pm ================================================================== --- autobox.pm (revision 451) +++ autobox.pm (local) @@ -23,7 +23,10 @@ # defaults and/or allow a wider or narrower range of types to be autoboxed. my $TYPEMAP = { - SCALAR => 'SCALAR', + SCALAR => 'SCALAR', + INTEGER => 'INTEGER', + STRING => 'STRING', + FLOAT => 'FLOAT', ARRAY => 'ARRAY', HASH => 'HASH', CODE => 'CODE', @@ -76,7 +79,7 @@ $args{$key} = $typemap->{$key}; } # else: already defined } else { - if ((defined $default) && ($default eq '')) { + if ((defined $default) && ($default eq '') || ($key =~ /(?:INTEGER|STRING|FLOAT)/)) { $args{$key} = $typemap->{$key}; } else { $args{$key} = $default; # namespace expansion is handled below === autobox.xs ================================================================== --- autobox.xs (revision 451) +++ autobox.xs (local) @@ -98,9 +98,45 @@ SV **svp; /* pointer to autobox_handlers value */ /* determine the package from the receiver's reftype() - or "UNDEF" if it's not a ref */ - reftype = SvOK(sv) ? sv_reftype((SvROK(sv) ? SvRV(sv) : sv), 0) : "UNDEF"; + if (SvOK(sv)) { + if (SvROK(sv)) { + reftype = sv_reftype(SvRV(sv), 0); + } else { + switch (SvTYPE(sv)) { + case SVt_IV: + reftype = "INTEGER"; + break; + case SVt_NV: + reftype = "FLOAT"; + break; + case SVt_PV: + reftype = "STRING"; + break; + default: + // TODO: throw fatal error + reftype = "SCALAR"; + break; + } + } + } else { + reftype = "UNDEF"; + } svp = hv_fetch(autobox_handlers, reftype, strlen(reftype), 0); + if (svp && SvOK(*svp) && SvOK(sv) && !SvROK(sv)) { + /* check undefined class for SCALAR types */ + + packsv = *svp; + packname = SvPVX(packsv); /* fake the package name */ + packlen = strlen(packname); + stash = gv_stashpvn(packname, packlen, FALSE); + + if ((long)HvTOTALKEYS(stash) < 3) {; + /* undefined class */ + svp = hv_fetch(autobox_handlers, "SCALAR", 6, 0); + } + } + if (svp && SvOK(*svp)) { packsv = *svp; packname = SvPVX(packsv); /* fake the package name */