[Maypole] Generating apps on the fly
David Baird
dave@riverside-cms.co.uk
Mon, 23 May 2005 00:15:00 +0100
Following on from recent discussions about building apps for multiple vhosts,
I've written a module that sets up Maypole apps 'on the fly'. I'd like to
solicit suggestions for a name for the thing. At the moment, I'm
provisionally calling it Maypole::Virtual::Application.
=head1 SYNOPSIS
package BeerDB;
use strict;
use warnings;
use Class::DBI::Loader::Relationship;
use Maypole::Virtual::Application;
Maypole::Virtual::Application->install_packages( qw( -Debug
AutoUntaint ) );
# beer for everyone!
sub virtual_packages { map { __PACKAGE__ . "::Site$_" } 1 .. 100 }
sub initialize_package
{
my ( $self, $package ) = @_;
$package =~ /(Site\d+)$/;
my $site = $1;
my $username = My::Config::System->get_beerdb_username_for( $site );
my $password = My::Config::System->get_beerdb_password_for( $site );
$package->setup( "dbi:mysql:BeerDB$site",
$username,
$password,
);
$package->config->{template_root} = '/usr/local/www/beerdb/htdocs';
$package->config->{uri_base} = '/';
$package->config->{rows_per_page} = 10;
$package->config->{display_tables} =
[ $package->config->loader->tables ];
$package->config->{application_name} = "The Beer Database for $site";
$package->auto_untaint;
$package->config->loader->relationship( $_ ) for (
'a brewery produces beers',
'a style defines beers',
'a pub has beers on handpumps',
);
# this would get called anyway during the first request, but
# putting it here is useful under mod_perl to get all initialisation
# done before forking off child servers
$package->init;
}