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 ;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' } } ) ;
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