Did we do this one already?

I have an embarrassingly large amount of code that has to do C<eval {
$foo->isa('Foo') }>, or C<eval { $foo->can('Bar') }> because there is a
chance that C<$foo> is an unblessed reference.

I would use UNIVERSAL::can directly, but I have some code (a
container/decorator class) that messes with isa so that it can
masquerade as the thing it contains (which could be one of a number of
classes) without having to be subclassed. Using UNIVERSAL::can
directly in this case could be vaguely disastrous:

    sub can {
        my($self, $method) = @_;
        my $can = $self->SUPER::can($method);
        return $can if $can;
        $can = ref($self) && $self->contents->can($method);
        return unless $can;
        return sub {
            my $self = shift;
            return $can->($self->contents, @_);
        };
    }

    sub isa {
        my($self, $class) = @_;
        $self->SUPER::isa($class) || 
            $self->contents->isa($class);
    }

-- 
Piers

Reply via email to