On March 26, 2003 10:04 am, Seb wrote:
> On Wed, 26 Mar 2003 08:05:06 -0800 (PST), Arkady Grudzinsky 
<[EMAIL PROTECTED]> spoke gently:
> > Hi, everyone.
> >
> > Assuming my application consists of several independent
> > "sub-applications", is it possible to initialize and run CGI::App objects
> > for these sub-applications from within the MainCGIApp.pm or do I have
> > to create independent applications and link them including 'redirect'
> > statement in the MainCGIApp.pm?  If I run another
> > object inside one of the methods, the output, of course, is doubled.
> >
> > What is the best way to deal with this?
> >
> > Thanks.
> >
> > Arkady.
>
> I encountered a similar dilemma. I wanted to create 'sub-applications',
> or 'modules' of a larger application framework. This as you know is
> easily solved by subclassing C::A, putting system-wide methods into your
> subclass, and then building sub-app modules that inherit from it. You're
> already doing this, if I'm not mistaken.
>
> However, I also didn't like all the nearly empty initialization CGIs
> sitting around, and having to link around between them. I do, in some
> cases, use a single-file approach to C::A apps:
>
> package MyCGIApp;
> use base CGI::Application;
> # some code...
> # ...
> # at the end...
> package main;
> my $app = new MyCGIApp;
> $app->run();
>
> But for this system, I wanted wanted just one URL to access the system,
> regardless of what component/module the user needed.
>
> My solution involves one index.cgi that knows what 'modules' there are
> in the system, and loads one depending on a CGI parameter that is passed
> around. In this simplified example, I have a directory structure...
>
> ./MyApp.pm         (master package, inherits C::A)
> ./index.cgi        (loader)
> (sub-app packages, each is a 'standard' C::A, inheriting from MyApp.pm:)
> ./MyApp/Main.pm
> ./MyApp/Jobs.pm
> ./MyApp/Parts.pm
> ./MyApp/Reports.pm
>
> And index.cgi looks something like this:
>
> #!/usr/bin/perl
> use CGI;
> my $q = new CGI;
>
> # $modules contains the list of params that are accepted for 'mod'
> my $modules = {
>       main => 'Main',
>       job =>  'Jobs',
>       part => 'Parts',
>       report => 'Reports',
> };
>
> # Get the needed module, if any
> my $mod = $q->param('mod');
>
> # Sanity check and set default
> unless ($modules->{$mod}) {
>       $mod = 'main';
> }
>
> # Load the module
> require "MyApp/$modules->{$mod}.pm";
>
> # Make/run an app object
> my $app = "MyApp::$modules->{$mod}"->new($q);
>
> $app->run();
>
> __END__
>
> I think it works rather nicely.

Anyone want to bet we could take this idea and make CGI::MultiApplication from 
it?  :-)

There's two ways I'm thinking of this.

1) as above, use one param to switch on C::A objects
2) add the ability to C::A itself to load a module on an as-needed basis, 
e.g.:

$self->run_modes_ex(
  mode_1 => { module => 'MyApp::Main', func => 'mode_1' },
);

I kind of prefer the second, myself...

---------------------------------------------------------------------
Web Archive:  http://www.mail-archive.com/[EMAIL PROTECTED]/
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to