DBIx::VersionedSubs::AutoLoad - autoload subroutines from the database
package My::App; use strict; use base 'DBIx::VersionedSubs::AutoLoad'; package main; use strict; My::App->startup($dsn); while (my $request = Some::Server->get_request) { My::App->update_code; # update code from the DB My::App->handle_request($request); }
This module overrides some methods in DBIx::VersionedSubs to prevent loading of the whole code at startup and installs an AUTOLOAD handler to load the needed code on demand. This is useful if startup time is more important than response time or you fork() before loading the code from the database.
You should be able to switch between the two implementations without almost any further code changes. There is one drawback of the AUTOLOAD implementation:
You need to explicitly load functions from the database that you wish to overwrite Perl code obtained from elsewhere.
This is the price you pay for using AUTOLOAD.
__PACKAGE__->init_code
Overridden to just install the AUTOLOAD handler.
__PACKAGE__->install_and_invoke NAME, ARGS
Loads code from the database, installs it into the namespace and immediately calls it with the remaining arguments via goto &code;
.
If no row with a matching name exists, an error is raised.
__PACKAGE__->update_code
Overridden to do lazy updates. It wipes all code that is out of date from the namespace and lets the AUTOLOAD handler sort out the reloading.
__PACKAGE__->load_code NAME
Retrieves the code for the subroutine NAME
from the database and calls __PACKAGE__->install_code $name,$code
to install it.
__PACKAGE__->retrieve_code NAME
Retrieves the code for the subroutine NAME
from the database and returns it as a string.
AUTOLOAD
An AUTOLOAD handler is installed to manage the loading of code that has not been retrieved from the database yet. If another AUTOLOAD handler already exists, the AUTOLOAD handler is not installed and a warning is issued.
Max Maischein, <corion@cpan.org>
This module is licensed under the same terms as Perl itself.