in reply to (tye)Re: Standard Package Preamble
in thread Standard Package Preamble

'use base' is a nice trick, something that certainly goes a step in the right direction instead of making @ISA references, which are a little strange anyway. At first sight, I was expecting something like @PCI to show up there for whatever equally mysterious reason.

Am I crazy to dream of a SuperExporter which could handle all of this for you automatically?
package Xyz; use strict; use SuperExporter ( EXPORT => qw [ FunctionAlpha FunctionBeta FunctionCharlie $scalarDelta ], EXPORT_OK => qw [ FunctionEcho $scalarFoxtrot ], VERSION => '1.0.2.3', );
Which would eliminate the unsavoury 'use vars', BEGIN{}, and a host of other strangeness, all at the expense of a non-standard module with a customized 'import()' routine. A bargain at half the price!

Replies are listed 'Best First'.
(tye)Re2: Standard Package Preamble
by tye (Sage) on Apr 18, 2001 at 08:54 UTC

    Such would be easy to write. I suspect things don't work that way now for fear of a performance hit...

    Which gave me a bit of a neat idea. If you adjust the usage slightly to use anonymous array references (which is pretty much required anyway):

    use Exporter::Easy ( VERSION => \'1.01', EXPORT => [qw[ FunctionAlpha FunctionBravo $calarCharlie ]], # etc. ); # (Closing delimiters look so sad when alone like that.)
    then you can just "export" the @EXPORT array into place without even having to copy the list of symbols:
    sub import { my $pkg= caller; push @{$pkg."::ISA"}, "Exporter"; while( @_ ) { my $key= shift; # (insert validation code here) *{$pkg."::".$key}= shift; } }
    which also takes care of the use vars functionality.

    Seems like a worthy module to me!

            - tye (but my friends call me "Tye")
      Instead of using anonymous array references, I was just going to use the same system that CGI.pm uses, not unlike processing a UNIX command line argument set. In that case, there are reserved words 'VERSION', 'EXPORT', etc. that trigger certain processing in the module. The rest are treated as parameters. The only downside is that to export a function called 'VERSION', for whatever reason, you would have to explicitly list it as '&VERSION'.

      Further, instead of latching on to the Exporter's import routine, it might be better to rewrite it to avoid the extra call and the @ISA use. What Exporter does is really neat, but isn't exactly rocket science.

      As much of a fan as I am of anonymous hashes, arrays, and references, in this case, it does seem to complicate what is supposeed to be a simplifying operation.

      On a side note, it's too bad that there aren't qw-style operators that return references:
      my ($ref) = qwa[ a better camel ]; print @$ref,"\n";
      Oh, and Exporter::Easy sounds a lot like Bone::Easy, no?