in reply to Re: use autouse with OOP
in thread use autouse with OOP

I tried use autouse 'My::Module' => 'My::Module::new'; and got: autouse into different package attempted at My/Module.pm (name of module changed).
If I do: use autouse 'My::Module' => qw(new); I get: Bareword "My::Module" not allowed while "strict subs" in use at... when I call my $o = new My::Module;
I realize I could call my $o = My::Module->new; But I would prefer not to change my code.

Replies are listed 'Best First'.
(tye)Re: use autouse with OOP
by tye (Sage) on Jun 15, 2001 at 00:09 UTC

    A less-well-known feature of use and require is that it gives a "hint" to the compiler that My::Module might be a class name so that "new My::Module" gets parsed okay. You don't need this hint unless you also have a subroutine "new" in the current package.

    $ perl use strict; my $o= new My::Module; ^D Can't locate object method "new" via package "My::Module" $ perl use strict; sub new; my $o= new My::Module; ^D Bareword "My::Module" not allowed while "strict subs" in use $ perl use strict; BEGIN { $My::Module::VERSION= 1.0; } sub new; my $o= new My::Module; ^D Can't locate object method "new" via package "My::Module" $
    So I'd suggest you start moving away from the "new My::Module" syntax as you can see how fragile it is.

    As others have said, autouse.pm has an out-right bug in it.

    You problem implies that use autouse My::Module => qw(new); predeclares "sub new;" instead of (or in addition to) "sub My::Module::new". It took me a bit to spot the problem. autouse.pm is not meant for use with OO modules and the routines you list get exported. My::Module doesn't normally export new() for good reason!

    To get something like autouse.pm except for OO modules is actually much less work than what autouse.pm does. See (tye)Re: $PERL_USE=$PERL_USE: but use the better version in the reply.

    If you want something that only does AutoNew for a particular package:

    sub My::Module::new { require My::Module; undef &My::Module::new; goto &My::Module::new; }

            - tye (but my friends call me "Tye")
Re: Re: Re: use autouse with OOP
by bikeNomad (Priest) on Jun 14, 2001 at 23:51 UTC
    Hmm... yes, you're right. There's a bug in autouse with modules whose names have '::' in them.

    I think you need to change the line in autouse.pm that says:

    my $index = index($func, '::');
    to:
    my $index = rindex($func, '::');
    You might want to submit this as a bug to the Perl Porters.

    update: wish I'd seen btrott's post before I figured the same thing out myself... would have saved some time. Anyway, I posted this to comp.lang.perl.moderated and comp.lang.perl.modules (wasn't sure which one it belonged in).