As far as I know constants must have a prototype of "()".
Right. So you can also see if no prototype is set. You can do
return 0 unless defined $proto and not length $proto;
to cover all alternatives. As it is now you test subroutines with no prototypes. Also, I'd prefer if $is_const was initialized to 0 since the return statements returns dito.