sub is_a { croak "is_a() expects a package name" if (scalar @_ != 1 || !defined $_[0] || ref $_[0] ne ''); my $type = shift; return sub { return 0 if (!defined $_[0]); return (ref $_[0] eq $type) ? 1:0; }; } #### use Scalar::Util qw( blessed ); sub is_or_extends { my ($type) = @_; croak "is_or_extends() expects a package name" if !defined($type) || ref($type) ne ''; return sub { return ( blessed($_[0]) ? $_[0]->isa($type) : UNIVERSAL::isa($_[0], $type) ); }; }