use strict;
use warnings;
use UNIVERSAL::which;
use Test::More;
package Foo;
use Carp;
our $DEBUG = 0;
sub DESTROY {};
sub AUTOLOAD{
my $method = our $AUTOLOAD;
$DEBUG and carp $method;
$method =~ s/.*:://o;
no strict 'refs';
*{$method} = sub{
my $self = shift;
$self->{$method} = shift if @_;
$self->{$method};
};
shift->$method(@_); # goto &$AUTOLOAD
}
package Bar;
use base 'Foo';
sub new { bless {}, shift };
package main;
plan tests => 3;
my $u = Bar->new;
is(UNIVERSAL::which('Bar', 'new'), 'Bar::new');
is(UNIVERSAL::which('Bar', 'foo'), 'Foo::AUTOLOAD');
$u->foo('bar'); # now Foo::foo is defined by invocation
is(UNIVERSAL::which('Bar', 'foo'), 'Foo::foo');