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 {
- # 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.)- #!/usr/bin/env perl
- 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 ;
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' } } ) ;
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.
No comments:
Post a Comment