DBX has asked for the wisdom of the Perl Monks concerning the following question:
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: use autouse with OOP
by btrott (Parson) on Jun 14, 2001 at 23:10 UTC | |
When I run this I get: Looking into this a bit more, this is happening because autouse looks for the first occurrence of '::' in the function name, then compares everything before that to the module name you passed in. In my opinion it should be looking for the *last* occurrence of '::'. This is autouse with both 5.005_03 and 5.6.1. The following patch seems to fix the behavior: But I haven't really explored all of the implications of this, as yet. :) Just be aware of this issue if you have the same problem. Personally, I don't use autouse for OOP (or really at all), because I tend to just require the module before I need to use it. | [reply] [d/l] [select] |
|
Re: use autouse with OOP
by bikeNomad (Priest) on Jun 14, 2001 at 22:36 UTC | |
As far as autouse, all it does is to make stubs in the proper packages that will load the module if it isn't loaded. And you have to name the routines that you want to make stubs for. So assuming that the first subroutine that you call in your module is always "new", and that you aren't exporting anything from your module, it should be sufficient to do: So that you'll get MyModule loaded when you go: Of course, if you call any other routines in your module first, they'd have to be added to the autouse list. Subsequent accesses to methods (subroutines) defined in MyModule will work fine after the first one causes the autoload. | [reply] [d/l] [select] |
by DBX (Pilgrim) on Jun 14, 2001 at 23:10 UTC | |
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. | [reply] [d/l] [select] |
by tye (Sage) on Jun 15, 2001 at 00:09 UTC | |
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: - tye (but my friends call me "Tye") | [reply] [d/l] [select] |
by bikeNomad (Priest) on Jun 14, 2001 at 23:51 UTC | |
I think you need to change the line in autouse.pm that says: to: 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). | [reply] [d/l] [select] |