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::WrapCGI
Acme::Bleach
Catalyst::Plugin::Acme::LOLCAT
Moose Don'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