in reply to UNIVERSAL::isa() vs. ref()

Arturo mentioned I should give a context for this, so here it is. I'm allowing users of this module-set I'm writing to pass me stuff either as a blah or a ref to blah. So, I need to determine if it's a ref or not, and what kind of ref is it. Here's the code I've got: (Other comments on the code are welcome!)

sub coerce_args { my $self = shift; my $type = shift; local $_; # This is needed to guarantee that $type is a string that can be # compared. return @_ if !defined $type || $type eq '' || $type =~ /\d/; if ($type eq 'ARRAY') { # if ($_[0]->isa($type)) { if (ref($_[0]) eq $type) { return @{$_[0]}; } else { return @_; } } elsif ($type eq 'HASH') { # if ($_[0]->isa($type)) { if (ref($_[0]) eq $type) { return %{$_[0]}; } else { return @_; } } elsif ($type eq 'SCALAR') { # if ($_[0]->isa($type)) { if (ref($_[0]) eq $type) { return ${$_[0]}; } else { return $_[0]; } #GGG This one is a little confusing... # } elsif ($type eq 'NONE') { # return @_; } else { return @_; # Unknown $type?? Maybe this is for objects? } }