summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-09-21 13:34:12 +0100
committerNicholas Clark <nick@ccl4.org>2010-09-21 13:36:05 +0100
commite2f1cb345b8e60b81ce9f8a291b2fc77b7e21c85 (patch)
tree4ec477ce2081a640b5aa0e1ae283b91a342a8b3f
parent87b9e16005b9e39b8a24388159e899fe54b95979 (diff)
downloadperl-e2f1cb345b8e60b81ce9f8a291b2fc77b7e21c85.tar.gz
Tweak XS::APItest to automatically add all functions to @EXPORT.
This saves manually maintaining the export list, which is makework given that the module is only used by its own tests. As the export now folds in symbols from subpackages, this will allow refactoring/reordering/rationalisation of the layout of testing routines in it.
-rw-r--r--ext/XS-APItest/APItest.pm60
-rw-r--r--ext/XS-APItest/t/temp_lv_sub.t2
2 files changed, 40 insertions, 22 deletions
diff --git a/ext/XS-APItest/APItest.pm b/ext/XS-APItest/APItest.pm
index 11011e0222..ca121adcc9 100644
--- a/ext/XS-APItest/APItest.pm
+++ b/ext/XS-APItest/APItest.pm
@@ -5,29 +5,47 @@ use strict;
use warnings;
use Carp;
-use base qw/ DynaLoader Exporter /;
-
-# Items to export into callers namespace by default. Note: do not export
-# names by default without a very good reason. Use EXPORT_OK instead.
-# Do not simply export all your public functions/methods/constants.
+use base 'DynaLoader';
# Export everything since these functions are only used by a test script
-our @EXPORT = qw( print_double print_int print_long
- print_float print_long_double have_long_double print_flush
- mpushp mpushn mpushi mpushu
- mxpushp mxpushn mxpushi mxpushu
- call_sv call_pv call_method eval_sv eval_pv require_pv
- G_SCALAR G_ARRAY G_VOID G_DISCARD G_EVAL G_NOARGS
- G_KEEPERR G_NODEBUG G_METHOD G_WANT
- apitest_exception mycroak strtab
- my_cxt_getint my_cxt_getsv my_cxt_setint my_cxt_setsv
- sv_setsv_cow_hashkey_core sv_setsv_cow_hashkey_notcore
- rmagical_cast rmagical_flags
- DPeek utf16_to_utf8 utf16_to_utf8_reversed my_exit
- sv_count
-);
-
-our $VERSION = '0.21';
+# Export subpackages too - in effect, export all their routines into us, then
+# export everything from us.
+sub import {
+ my $package = shift;
+ croak ("Can't export for '$package'") unless $package eq __PACKAGE__;
+ my $exports;
+ @{$exports}{@_} = () if @_;
+
+ my $callpkg = caller;
+
+ my @stashes = ('XS::APItest::', \%XS::APItest::);
+ while (my ($stash_name, $stash) = splice @stashes, 0, 2) {
+ while (my ($sym_name, $glob) = each %$stash) {
+ if ($sym_name =~ /::$/) {
+ # Skip any subpackages that are clearly OO
+ next if *{$glob}{HASH}{'new'};
+ push @stashes, "$stash_name$sym_name", *{$glob}{HASH};
+ } elsif (ref $glob eq 'SCALAR' || *{$glob}{CODE}) {
+ if ($exports) {
+ next if !exists $exports->{$sym_name};
+ delete $exports->{$sym_name};
+ }
+ no strict 'refs';
+ *{"$callpkg\::$sym_name"} = \&{"$stash_name$sym_name"};
+ }
+ }
+ }
+ if ($exports) {
+ my @carp = keys %$exports;
+ if (@carp) {
+ croak(join '',
+ (map "\"$_\" is not exported by the $package module\n", sort @carp),
+ "Can't continue after import errors");
+ }
+ }
+}
+
+our $VERSION = '0.22';
use vars '$WARNINGS_ON_BOOTSTRAP';
use vars map "\$${_}_called_PP", qw(BEGIN UNITCHECK CHECK INIT END);
diff --git a/ext/XS-APItest/t/temp_lv_sub.t b/ext/XS-APItest/t/temp_lv_sub.t
index b45e27ba28..938a5c2cd0 100644
--- a/ext/XS-APItest/t/temp_lv_sub.t
+++ b/ext/XS-APItest/t/temp_lv_sub.t
@@ -4,7 +4,7 @@ use strict;
use utf8;
use Test::More tests => 5;
-BEGIN {use_ok('XS::APItest')};
+require_ok('XS::APItest');
sub make_temp_mg_lv :lvalue { XS::APItest::TempLv::make_temp_mg_lv($_[0]); }