in reply to Re: mod_perl and objects
in thread mod_perl and objects
In general, you're correct: Perl prototypes have nothing to do with subroutines being called as methods. However the original poster was asking about mod_perl handlers and is quite correct in interpreting the docs to infer a relationship between prototypes and handlers being called as methods.
When you write a mod_perl handler, you create a module (say YourModule) and in it you create a subroutine called handler. At the appropriate point in the request chain, mod_perl will create a request object $r and call your handler like this:
YourModule::handler($r)However a piece of magic comes into play if you defined your handler sub with a prototype like this:
sub handler ($$) { my($class, $r) = @_; ...
In this case, mod_perl will invoke your handler as a class method like this:
YourModule->handler($r)The advantage of this is that someone else can subclass YourModule and override one or two methods, but they can inherit the handler method from your module.
Actually I'd recommend against using the prototyped handler syntax in new code as it's not compatible with mod_perl 2.0 (which can pass more arguments to a handler). The new way to do it is to use the 'method' attribute on your subroutine definition:
sub handler : method { my($class, $r) = @_; ...
This will work in mod_perl 1.0 or 2.0 as long as you're running Perl 5.6 or better.
The original poster's problem was expecting the handler to be invoked as an object method. If you need an instance of your class then you need to call your constructor to create one yourself in the handler.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Re: mod_perl and objects
by geektron (Curate) on Jul 25, 2003 at 09:30 UTC | |
by grantm (Parson) on Jul 28, 2003 at 10:11 UTC | |
by geektron (Curate) on Jul 28, 2003 at 18:06 UTC | |
by grantm (Parson) on Jul 28, 2003 at 22:27 UTC |