AUTOLOAD
Ovid
publiustemp-londonpm at yahoo.com
Thu Jan 18 15:45:57 GMT 2007
--- Adriano Ferreira <a.r.ferreira at gmail.com> wrote:
> On 1/17/07, ti at lemonia.org <ti at lemonia.org> wrote:
> > UNIVERSAL::can tells you what methods are *in the hash*. It doesn't
> tell
> > you what AUTOLOAD would do, because, as you say, it can't.
>
> ->can is a method. Its base implementation (the one provided by
> UNIVERSAL package) "tells you what methods are *in the hash*" (as you
> said).
To be fair, it doesn't quite do that (depending upon how you look at
it). If you merely have a forward declaration and no method,
UNIVERSAL->can($method) succeeds, but then invoking the method fails.
package Foo;
sub bar;
package main;
use Test::More 'no_plan';
can_ok 'Foo', 'bar';
ok my $method = Foo->can('bar'), '... can("bar") should succeed';
diag +Foo->$method;
Results in the rather confusing:
ok 1 - Foo->can('bar')
ok 2 - ... can("bar") should succeed
Undefined subroutine &Foo::bar called at universal.pl line 13.
1..2
# Looks like your test died just after 2.
ok
All tests successful.
Files=1, Tests=2, 0 wallclock secs ( 0.04 cusr + 0.00 csys = 0.04
CPU)
Basically, a forward declaration appears to fill the *Foo::bar{CODE}
slot. I personally think this is bug in 'can', but I'm sure opinions
will differ on this.
Cheers,
Ovid
--
Buy the book -- http://www.oreilly.com/catalog/perlhks/
Perl and CGI -- http://users.easystreet.com/ovid/cgi_course/
More information about the london.pm
mailing list