[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;
    }