[Chicago-talk] ->can and AUTOLOAD

Steven Lembark lembark at wrkhors.com
Thu Dec 4 11:05:02 CST 2003


You can add a universal autoloader that delivers a more
descriptive error message then croaks. This guarantees
that $foo->$name will always be callable and that you
will get useful error messages if $name is meaningless
for the object/package:

	sub UNIVERSAL::AUTOLOAD
	{
		# discombobulate @_ and print a useful
		# description of why the sub does not
		# exist for this object/class/package.

		...

		confess "Bogus call: $package cannot $name";
	}

Now you can always use:

	my $sub = $foo->can( $name ) || $foo->can( 'AUTOLOAD' );

	$foo->$sub( @argz );

either you'll hit $name the fisrt time, hit a 'real' autoloader,
or bounce into UNIVERSAL::AUTOLOAD which can tell you exactly
where the process went wrong.

If you check the pod for the 5.8 version of Carp (may have
been there in 5.6) it has setups for classes to trust (i.e.,
report the error from however many levels of caller up the
stack it takes to get out of that class). Adding UNIVERSAL
and the dispatcher's package to this will show you where
the call with $name in it came from with less garbage to
trace through.


--
Steven Lembark                               2930 W. Palmer
Workhorse Computing                       Chicago, IL 60647
                                            +1 888 359 3508



More information about the Chicago-talk mailing list