I am working on a framework for modern web APIs using CGI and old-school Perl objects, inspired by what I learned from perlbrew. This is more or less how the included modules go. This auto-exports every function that starts with 'api_', so that I could write
helper_one()
and
helper_two()
with no worries about them being exported, and without having to add
api_butt
,
api_stump
, and
api_tail
to @EXPORT, because it's striking me that the export list follows documentation as a
pernicious form of code duplication.
- package API_Proof ;use strict ;
- use warnings FATAL => 'all' ;
-
- use Exporter qw{import} ;
-
- our $VERSION = 0.1 ;
-
- our @EXPORT ;
- for my $entry ( keys %API_Billing_0_1:: ) {
- next if $entry !~ /^api_/mxs ;
- push @EXPORT, $entry ;
- }
-
- sub api_stub {
-
- }
package API_Proof ;use strict ;
use warnings FATAL => 'all' ;
use Exporter qw{import} ;
our $VERSION = 0.1 ;
our @EXPORT ;
for my $entry ( keys %API_Billing_0_1:: ) {
next if $entry !~ /^api_/mxs ;
push @EXPORT, $entry ;
}
sub api_stub {
# code goes here
}
I intend to put the whole deal up on
+GitHub eventually, but to avoid complication, I'll just get to the point where it's used, below. I'm exporting everything that starts with api_, so it's all available for
$api->run()
when we get there. (
It's all in previous posts.)
-
-
- use strict ;
- use warnings ;
- use lib '/path/to/lib' ;
-
- my $api = API->new( @ARGV ) ;
- $api->run() ;
-
- package API ;
- <pre class="perl" name="code">use lib '/path/to/lib' ;
- </pre>
- use base 'API_Base' ;
- use API_Stub ;
#!/usr/bin/env perl
use strict ;
use warnings ;
use lib '/path/to/lib' ;
my $api = API->new( @ARGV ) ;
$api->run() ;
package API ;
use lib '/path/to/lib' ;
use base 'API_Base' ;
use API_Stub ;
And here is where we run into
Perl Best Practices and
Perl::Critic. I've been running some modules through
perlcritic -1
for sake of being complete, and it lead me to do some changes, and there's one that is keeping me from being clean. It's that I'm using
@EXPORT
. I should be using
@EXPORT_OK
or
%EXPORT_TAGS
instead, it says. This means, that first code block should have something like this instead.
- my @export ;
- for my $entry ( keys %API_Bard:: ) {
- next if $entry !~ /^api_/ ;
- push @export, $entry ;
- }
-
- $EXPORT_TAGS{ api } = [ @export ];
- our @EXPORT_OK = ( @{ $EXPORT_TAGS{ 'api' } } ) ;
my @export ;
for my $entry ( keys %API_Bard:: ) {
next if $entry !~ /^api_/ ;
push @export, $entry ;
}
$EXPORT_TAGS{ api } = [ @export ];
our @EXPORT_OK = ( @{ $EXPORT_TAGS{ 'api' } } ) ;
And then use API_Stub qw{:api}
. I am not quite convinced. I'm open, though. I guess I would just like to know what the problem with export by default is, but this isn't in PBP.