Phoenix.pm: package Autoloading

Pablo Velasquez pablo at dosomething.org
Wed Oct 20 12:30:02 CDT 1999


Tim,
This sounds really intriguing...I wish I knew OOP to participate :)

I did just get the OOP book though (Monday), any minute now it will sink in.

-Pablo

At 10:42 AM 10/20/99 EDT, you wrote:
>I talked about a certain AUTOLOAD technique at the meeting.  There are 
>others, but this seemed to suit my particular situation.
>
>My problem was that I wanted to just be able to call
>
>FormVar::Text->new()  # for example,
>
>without having to worry about whether or not the FormVar::Text package (also 
>read file) was required already.  If FormVar::Text is a completely empty and 
>undefined package at the time of calling new(), then you will always get an 
>error, because it cant find new, and has no information on where else to
look.
>
>So, my (I'm sure unoriginal) idea was to use an AUTOLOAD routine in a
package 
>whose only reason for existence is to AUTOLOAD the FormVar packages.  I call 
>this package LoadMe for lack of a better name.  The LoadMe package AUTOLOAD 
>routine parses the package name out of the called method (in the $AUTOLOAD( 
>variable), requires the package, and then calls the method again.  The 
>package called should then reassign @ISA, since you don't want 'LoadMe' as a 
>parent anymore.
>
>***** The Code *****
>
>package FormVar;
>
># all of the possible packages that could be called.
>@FormVar_Packages = ( qw(
>    FormVar::Text
>    FormVar::Password
>    FormVar::Checkbox
>    FormVar::CheckboxGroup
>    FormVar::Button
>    FormVar::SubmitButton
>    FormVar::Option
>    FormVar::OptionGroup
>    FormVar::Radio
>    FormVar::VarGroup
>    FormVar::ERR
>    FormVar::SelectList
>    FormVar::SelectListMultiple
>    FormVar::Cluster
>    FormVar::Textarea
>    FormVar::Page
>));
>
># To make this work, we need each package already built with an @ISA
pointing 
>to
># 'FormVar::LoadMe'
>
>map { @{"$_\::ISA"} = ('FormVar::LoadMe') }  @FormVar_Packages;  # @ISA will 
>be overwritten in file
>
># Now for the 'LoadMe' AUTOLOAD routine...
>
>package FormVar::LoadMe;
>
>sub AUTOLOAD  {
>    my $self = $_[0];
>    my $class = ref($self) || $self;
># use and eval to capture an error and spit out something more meaningful.
>    eval ("require HTML::$class");
>    $@ and die "AZWEBS ERROR: error in requiring '$class' (error 
>follows)...\n$@";
>
># now lets try the same method call again with the same arguments
># You will get an error if you don't reassign @ISA in the required package
># as this then becomes recursive.
>
>    &{$AUTOLOAD}(@_)
>
>}
>
># Then return to the FormVar package definitions
>package FormVar;
>
>***** End Code *****
>
>If anyone has any questions, give me a buzz!!
>
>Check 6!
>
>Tim
>




More information about the Phoenix-pm mailing list