You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by as...@hyperreal.org on 1998/06/16 08:27:33 UTC
cvs commit: modperl mod_perl_method_handlers.pod
ask 98/06/15 23:27:33
Added: . mod_perl_method_handlers.pod
Log:
My little text about methodhandlers/objects in modperl.
There is one 'pod bug'. I've posted to clpm for help. :)
Revision Changes Path
1.1 modperl/mod_perl_method_handlers.pod
Index: mod_perl_method_handlers.pod
===================================================================
=head1 NAME
Methodhandlers - a little article about methodhandlers and
objecthandlers
=head1 DESCRIPTION
Described here are a few examples and hints how to use methodhandlers
(and objects) with modperl.
This document assumes familiarity with at least L<perltoot> and
"normal" usage of the Perl*Handlers.
It isn't strictly modperl related, more like "what I use objects for
in my modperl environment".
Methodhandlers was introduced between as an experimental feature
between modperl 1.10 and 1.11. They can be enabled in 1.12 with
=head1 WHY?
The short version: For pretty much the same reasons we're using OO
perl everywhere else. :-) See L<perltoot>.
The slightly longer version would include some about code reusage and
more clean interface between modules.
=head1 SIMPLE EXAMPLE
Make sure you're running at least modperl 1.12 and you have compiled
modperl with PERL_METHOD_HANDLERS=1 or EVERYTHING=1.
Let's start with a simple example.
In httpd.conf:
<Location /obj-handler>
SetHandler perl-script
PerlHandler $My::Obj->method
</Location>
In startup.pl or another PerlRequire'd file:
package This::Class;
$My::Obj = bless {};
sub method ($$) {
my($obj, $r) = @_;
$r->send_http_header("text/plain");
print "$obj isa ", ref($obj);
0;
}
which displays:
This::Class=HASH(0x8411edc) isa This::Class
=head1 A LITTLE MORE ADVANCED
That wasn't really useful, so let's try something little more advanced.
I've a little module which creates a graphical 'datebar' for a client.
(See C<http://www.hip.dk/webajour/datebar>). It's reading a lot of
small gifs with numbers and weekdays, and keeping them in memory in
GD.pm's native format, ready to be copied together and served as gifs.
Now I wanted to use it at another site too, but with a different
look. Obviously something to do with a object. Hence I changed the
module to a object, and can now do a
$Client1::Datebar = new Datebar(
-imagepath => '/home/client1/datebar/',
-size => [131,18],
-elements => 'wday mday mon year hour min',
);
$Client2::Datebar = new Datebar
-imagepath => '/home/client2/datebar/',
-size => [90,14],
-elements => 'wday hour min',
);
And then use $Client1::Datebar and $Client2::Datebar as PerlHandlers
in my Apache configuration.
I've a webinterface system to our content-database. I've created
objects to handle the administration of articles, banners, images and
other content. It's then very easy (a few lines of code) to enable
certain modules for each client, depending on their needs.
Another area where I use objects with great success in my modperl
configurations is database abstraction. All our clients using the
webinterface to handle f.x. articles will use a simple module to
handle everything related to the database. Each client have
$Client::Article = new WebAjour::Article(-host => 'www.client.com');
in a module what will be run at server startup.
I can then use some simple methods from the $Client::Article object in
my embperl documents, like:
[- $c = $Client::Article->GetCursor(-layout=>'Frontpage') -]
[$ while($c->Fetch) $]
<h2>[+ $c->f('header') +]</h2>
[+ $c->f('textfield') +]
[$ endwhile $]
Very very useful!
=head1 TRAPS
mod_perl expects object handlers to be in the form of a string, which it
will thaw for you. That means that something like
$r->push_handlers(PerlHandler => $self->perl_handler_method);
DON'T work, since Perl isn't able to see $self once it goes to PerlHandler.
The best solution to this is to use an anonymous subroutine and pass it $r
yourself, like this:
$r->push_handlers(PerlHandler =>
sub {
my $r = shift;
$self->perl_handler_method($r);
}
);
=head1 AUTHOR
This document is written by Ask Bjoern Hansen <as...@netcetera.dk> or
<as...@apache.org>. Corrections and suggestions are most
welcome. In particular would more examples be appreciated, most of my
own code is way too integrated with our system, which isn't suitable
for public release.
Some codesnippets is from Doug MacEachern.
=head1 SEE ALSO
L<mod_perl>, L<Apache>, L<perltoot> (also available at
C<http://www.perl.com/CPAN/doc/FMTEYEWTK/perltoot.html>)