perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <>
Subject Re: [mp2] $r->current_callback please
Date Wed, 07 May 2003 23:06:23 GMT
Josh Chamas wrote:
> Hey,
> I was wondering if we could get $r->current_callback into the standard 
> mp2 API.
> It will just be one less thing to worry about when making things work 
> across
> mp2 & mp1.
> Currently, this is implemented in Apache::compat with a call to
> Apache::current_callback, but I was wondering if this could be made
> standard for $r, maybe in addition to Apache::current_callback() working 
> ...
> I have code in Apache::ASP that I am working on that is looking like:
>     my $current_callback = eval { $r->current_callback } || eval { 
> Apache::current_callback() };
>     if($current_callback) {
>         $request_binary_read = ($current_callback =~ 
> /^Perl(Response)?Handler$/) ? 1 : 0;
>     } else {
>         $request_binary_read = 1;
>     }                                                                               

> Like other environments I am sure, Apache::ASP runs in at least 3 modes,
> which is why this coding gets hairy... so far its running in mp1, mp2, & 
> mod_cgi.
> I have a CGI $r emulator, but it ends up looking more like mp1 than mp2.

It's not $r->current_callback, because in mp2, there are more than twice 
callbacks which are unrelated to $r. So it'd be very inconsistent to have to 
call $r->current_callback for request phases, but Apache::current_callback for 
the rest? Eventually everybody will shift to use mp2, and this kind of alias 
will be just annoying. Do you agree?

As for making the code less hairy to support several modes, I believe the best 
solution is to write your own wrappers and subclasses, moving all the 
specifics there and making a single API for all modes. This will make your 
code very clean and free of ugly branches.

For example: dynamically subclass $r (e.g. in Apache::ASP::Request) and 
provide your own extensions depending on whether you are running mp1 or mp2, 
so $r->current_callback can work regardless.

package Apache::ASPRequest;

sub new {
     my (class, $r) = @_;
     @Apache::ASPRequest::ISA = ref($r);
     bless $r, __PACKAGE__;

if (Apache::ASP::MP2) {
     *current_callback = sub { shift; Apache::current_callback() }

and in Apache::ASP, call my $r = Apache::ASPRequest->new($r), similar to what 
Apache::Request does.

I believe you can make this for mp1, non-mp as well, so your code becomes very 

Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker     mod_perl Guide --->

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message