[cgiapp] can AUTOLOAD sub be named AUTOLOAD?

Darin McBride dmcbride at naboo.to.org
Wed Apr 16 12:38:19 EDT 2008

On April 16, 2008 09:48:42 am Perrin Harkins wrote:
> >  But if the AUTOLOAD problem is a bug that can be fixed
> >  easily, then I'd rather do that than use this workaround.
> I have no idea if it's a bug or not, but a sub called AUTOLOAD has a
> well-known meaning in Perl which you are not entirely following here,
> and that seems very confusing to me.  It's kind of like wanting to
> call your custom cleanup method DESTROY.

This looks like a minor bug to me - CA is reusing a well-known meme in a way 
that doesn't quite work.  When I started using CA, the ability to just 
specify runmodes and subs that were the same name didn't exist, so having 
C<AUTOLOAD => \&catchall> was not any worse than also having to specify 
C<myrunmode => \&myrunmode>.  Now, there is an indirect implicit suggestion 
to use a sub called 'AUTOLOAD' to handle the 'AUTOLOAD' action, based on the 

           Often, it makes good organizational sense to have your run modes
           map to methods of the same name.  The array-ref interface provides
           a shortcut to that behavior while reducing verbosity of your code.

My suggestion is that AUTOLOAD is not, and never has been, a runmode.  No one 
should be able to load http://myapp.net/?rm=AUTOLOAD.  I've not tested to see 
if that actually calls the AUTOLOAD runmode or not, but it shouldn't.  (I 
suspect it does.)

Instead, if I want the fallback, I should not be setting a run_mode, I should 
be setting a fallback:


This is something that should be callable only in cases where the fallback is 

Something like this:

--- Application.pm.orig	2008-04-16 10:15:17.000000000 -0600
+++ Application.pm	2008-04-16 10:32:13.000000000 -0600
@@ -135,14 +135,14 @@
 	my $rmeth;
 	my $autoload_mode = 0;
-	if (exists($rmodes{$rm})) {
+	if (exists($rmodes{$rm}) and $rm ne 'AUTOLOAD') {
 		$rmeth = $rmodes{$rm};
 	} else {
-		# Look for run mode "AUTOLOAD" before dieing
-		unless (exists($rmodes{'AUTOLOAD'})) {
+		# Look for fallback mode before dieing
+        $rmeth = $self->fallback_mode();
+		unless ($rmeth) {
 			croak("No such run mode '$rm'");
-		$rmeth = $rmodes{'AUTOLOAD'};
 		$autoload_mode = 1;
@@ -526,6 +526,24 @@
+sub fallback_mode {
+	my $self = shift;
+	my ($fallback_mode) = @_;
+	# First use?  Create new __FALLBACK_MODE
+	$self->{__FALLBACK_MODE} = undef unless (exists($self->{__FALLBACK_MODE}));
+	# If data is provided, set it.
+	if (defined($fallback_mode)) {
+		$self->{__FALLBACK_MODE} = $fallback_mode;
+	}
+    # if we have a fallback, use it, if we have the old deprecated
+    # AUTOLOAD mode, use that instead.
+    return $self->{__FALLBACK_MODE} || {$self->run_modes()}{AUTOLOAD};
 sub tmpl_path {
 	my $self = shift;
 	my ($tmpl_path) = @_;

Of course, CAP::AutoRunmode would need a flag for that, too - I'm not 
providing a sample patch for that ;-)

> Or maybe I just have a chip on my shoulder because I think obsession
> with syntax is one of the more self-destructive traits of the Perl
> community.

Sometimes that obsession finds holes.  And, depending on how poorly your 
autoload is written, that hole may be security-related.

But, in reality, syntax is about communication between author and computer.  
And clear, concise syntax is about maintainability.  I wish my coworkers were 
as concerned with syntax as many in the Perl community.

More information about the cgiapp mailing list