Matt Sergeant msergeant at
Wed Jan 17 23:47:05 GMT 2007

On 17-Jan-07, at 8:36 AM, chromatic wrote:

> Note also that:
> 1) can() returns a subroutine reference.  Don't break that.
> 2) can() is a method.  Methods aren't functions.  If you call a  
> method as a
> function, you've introduced unreliability into everyone's code  
> again, and of
> course things will break.

A good implementation of AUTOLOAD where you've implemented ->can()  
right might be this (subject to the implementations returned from - 
 >can() not changing based on object state):

   my $method = $AUTOLOAD;
   $method =~ s/.*:://;
   my $implementation = $_[0]->can($method)
     || croak "Can't locate method \"$method\" via thing $_[0]";
   no strict 'refs';
   *{$AUTOLOAD} = $implementation;
   goto &$AUTOLOAD;

Don't forget to do something about DESTROY though. It always bothered  
me that there wasn't an empty UNIVERSAL::DESTROY - why should an  
unimplemented DESTROY drop into AUTOLOAD?

This email has been scanned by the MessageLabs Email Security System.
For more information please visit 

More information about the mailing list