in reply to Importing CGI methods into a subclass as a class method

Ideally, you would do this in some new() method, but _init() should work just fine, too. You want to use __PACKAGE__ because you want the methods defined at the lowest package possible. That way, code re-use is preserved.

Update: broquaint made the good point that this could also be put in some BEGIN block.

my @methods = qw( param foo bar ); sub _init { my $self = shift; { no strict 'refs'; unless (defined \&{__PACKAGE__."::$methods[0]"}) { foreach my $method (@methods) { *{__PACKAGE__."::$method"} = sub { my $self = shift; return undef unless UNIVERSAL::isa($self->query}, CGI); return $self->{query}->$method{@_); }; } } } # Rest of stuff here. }
I personally don't like AUTOLOAD. It smacks too much of hidden black magic to me. :-)

------
We are the carpenters and bricklayers of the Information Age.

Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

Replies are listed 'Best First'.
Re: Re: Importing CGI methods into a subclass as a class method
by ihb (Deacon) on Feb 13, 2003 at 23:24 UTC

    It's good to test your code. At least with -c.

    Line 12: A reference is always defined. So the useful code will never be executed.
    Line 18: There's a missing { and CGI won't pass under strict subs. And does a return value of undef make most sense?
    Line 19: A { should be replaced with (.

    Another thought: Wouldn't it be better to check for definedness for every subroutine instead of just the first? What if he decides to define another param subroutine and forget to remove param from @methods? Then the other subroutine won't get defined either. Of course, it would be a lot better to put it in a BEGIN block, as noted. Then you don't have to check for definedness manually, since perl will warn about redefinitions.

    ihb