WrapCGI: CGI.pm in your Catalyst app.
Catalyst::Controller::WrapCGI allows you to use CGI.pm directly in your Catalyst controller.
A huge benefit of this is quick porting of a legacy CGI.pm application directly into a Catalyst skeleton in an almost cut-and-paste fashion. You still have the full power of the Catalyst framework, but you don't lose any of your CGI application's functionality.
To demonstrate a quick WrapCGI application, we're going to write a pastebot using WrapCGI, Acme::Bleach (to keep our code clean :-) ) and for giggles, translate our application's output with Catalyst::Plugin::Acme::LOLCAT.
Packing list
Catalyst::Controller::WrapCGIAcme::BleachCatalyst::Plugin::Acme::LOLCATMooseDon't freak out, this is simply to create an accessor :-)
Install, and we'll move on.
Getting Started
This article assumes you are familiar with creating a Catalyst application skeleton, so we're going to skip that part in this article.
Your first step (after creating your application) is to create a controller called Paste. You should also know how to do this, but for the sake of sanity, here's what it looks like:
perl script/myapp_create.pl controller Paste
Next, open up this new controller in your favorite text editor and add the following lines:
use Moose;
use parent 'Catalyst::Controller::WrapCGI';
use CGI qw/:html3/;
has 'cgi' => (is =>'rw', isa =>'CGI', default => sub { CGI->new });
If you're not familiar with Moose at all, you should get to be :-). All this line is saying is "create an accessor called 'cgi' that when called with $self->cgi defaults to an anonymous sub that creates a new CGI object". Easy as pie :-)
Add the following lines to your controller after you've absorbed up to here:
sub index :Path('/cgi-bin/paste.cgi') {
my ( $self, $c ) = @_;
my $q = $self->cgi;
$self->cgi_to_response( $c, sub {
print $q->header, $q->start_html('Clean your code!'),
$q->h1('Paste your code here'),
$q->start_form(
-name => 'paste',
-action => $c->uri_for('/cgi-bin/bleachit.cgi'),
),
$q->textarea (
-name => 'code',
-rows => '10',
-cols => '80'
),
$q->br,
$q->submit(
-name => 'translate',
-value => 'Paste it!',
),
$q->end_form,
$q->end_html;
});
}
sub paste : Path("/cgi-bin/bleachit.cgi") {
my ($self, $c) = @_;
my $q = $self->cgi;
$self->cgi_to_response( $c, sub {
my $code = $q->param('code');
my $cleaned_string = eval "use Acme::Bleach; $code" . "";
print $q->header, $q->start_html('Cleaned code'),
$q->h1("Your code, cleaned:"),
$q->pre($cleaned_string),
$q->end_html;
});
}
That's *it*. That's how WrapCGI integrates CGI into Catalyst.
Tada!
AUTHOR
Devin Austin aka dhoss
devin.austin@gmail.com