Agreed, but I say playing nicely is a practice that does not scale.
If you won't distribute the code there is nothing wrong
with using AUTOLOAD.
I am saying that AUTOLOAD does not scale well. Every
use of AUTOLOAD in a program should be under the control of one party.
If two separate authors use AUTOLOAD in the same program
breakage is likely.
Being conservative, I would be suspicious of any program with
more than one AUTOLOAD. If
two AUTOLOAD routines exist in a hierarchy there is a problem. (Don't forget UNIVERSAL.)
This is a known problem.
Consider:
#!/usr/bin/perl
use strict;
use warnings;
# I decide to use a module
package Vehicle;
use vars '$AUTOLOAD';
sub new { return bless {}, $_[0]; }
# handle all "V*" calls
sub AUTOLOAD {
my ($key) = $AUTOLOAD =~/::(\w+)/;
return if $key =~ /^[A-Z]+$/;
die "Vehicle::AUTOLOAD can't cope as $key"
unless $key =~ /^[vV]/;
print "Leaving Vehicle::AUTOLOAD as $key$/";
}
# with my program below
package Animal;
use vars '$AUTOLOAD';
sub new { return bless {}, $_[0]; }
# handle all "A*" calls
sub AUTOLOAD {
my ($key) = $AUTOLOAD =~/::(\w+)/;
return if $key =~ /^[A-Z]+$/;
die "Animal::AUTOLOAD can't cope as $key"
unless $key =~ /^[aA]/;
print "Leaving Animal::AUTOLOAD as $key$/";
}
package Horse;
use vars qw/ @ISA /;
@ISA = qw/ Vehicle Animal /;
package main;
# the two usages cannot work together, I needed to
# know that Vehicle used AUTOLOAD so I could avoid it
# or rewrite my code to eliminate AUTOLOAD.
my $h = Horse->new;
$h->Veh();
$h->Ani(); # call intercepted by Vehicle AUTOLOAD
Be well. |