Hi Stas,

Am Freitag, 13. Februar 2004 23:56 schrieb Stas Bekman:
> I've extended lookup_method to support sub-classed objects. which
> simplifies the usage. It's now committed. Here is a test:
>
> perl -MModPerl::MethodLookup -le '\
> package Apache::RequestRec; sub new { bless {}, shift }; \
> package My::Request; @ISA = qw(Apache::RequestRec); \
> package main; my $obj = My::Request->new();  \
> my($hint, @modules) = ModPerl::MethodLookup::lookup_method("print", $obj);
> \ print $hint'
> To use method 'print' add:
>          use Apache::RequestIO ();
>
> So EazyLife.pm, including fixes for your previous comments, looks like:
>

It works better, but not right. It has the same problems as the last one, but 
the other way around ;-)

On my first test I found out that it is incredible slow. So iI move the 

              return if $AUTOLOAD =~ /$skip/;

line before the lookup_method. That is not right ever, your way looks much 
better, but it was so slow. Perhaps other ideas are around.

The second problem is if I have a class that inherits from another class with 
splitted functions like Apache::RequestRec.

package xxx;
@ISA='Apache::RequestRec';
sub new { bless $_[1], $_[0] }

sub handler : method {
  my ( $class, $rec ) = @_;
  xxx->new( $rec )->print('hello world');
}

then AUTOLOAD is called and found out, that Apache::RequestRec is the 
superclass of xxx and that Apache::RequestIO must be loaded. We require 
Apache::RequestRec and then goto subroutine xxx::print. That is an endless 
loop, since it calls AUTOLOAD to find out about xxx::print. In this case we 
must call Apache::RequestRec::print, but we do not know about it we only know 
Apache::RequestIO.

> package ModPerl::EazyLife;
>
> use ModPerl::MethodLookup ();
> use Carp;
>
> my @avail_modules = ModPerl::MethodLookup::avail_modules();
> push @avail_modules, 'Apache'; # XXX: may go away
> my $skip = qr|(::)?DESTROY$|;
> for my $module (@avail_modules) {
>      *{"$module\::AUTOLOAD"} = sub {
>          my($hint, @modules) =
>              ModPerl::MethodLookup::lookup_method($AUTOLOAD, @_);
>
>          if (@modules) {
>              eval "require $_" for @modules;
>              goto &$AUTOLOAD;
>          }
>          else {
>              return if $AUTOLOAD =~ /$skip/;
>              croak $hint || "Can't find $AUTOLOAD";
>          }
>      };
> }
>
> 1;
>
> You need to update your cvs and rebuild (because of the changes in the
> autogenerated MethodLookup.pm module).
>
Have a nice day.
-- 
Boris

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to