The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use Test::More tests => 20;

use No::Worries::Export qw(export_control);

#
# exporting module
#

package e;
{
    use constant C => "c00l";
    our $s = "scalar";
    our @a = (0 .. 3);
    our %h = ("key" => "val");
    sub f () { return("foo") }
    sub import : method {
	my($pkg, %exported);
	$pkg = shift(@_);
	grep($exported{$_}++, qw(C f $s @a %h));
	::export_control(scalar(caller()), $pkg, \%exported, @_);
    }
}

#
# importing module
#

package i;
{
    no strict;
    no warnings qw(once);

    ::ok(!defined(&C),             "before - constant");
    ::ok(!defined(&f),             "before - function");
    ::ok(!defined($s),             "before - scalar");
    ::ok(!scalar(@a),              "before - array");
    ::ok(!scalar(%h),              "before - hash");

    e->import("*");

    ::ok(defined(&C),              "after - constant");
    ::ok(defined(&f),              "after - function");
    ::ok(defined($s),              "after - scalar");
    ::ok(scalar(@a),               "after - array");
    ::ok(scalar(%h),               "after - hash");

    ::is(C(), "c00l",              "test - constant");
    ::is(f(), "foo",               "test - function");
    ::is($s, "scalar",             "test - scalar");
    ::is(scalar(@a), 4,            "test - array");
    ::is(join("",keys(%h)), "key", "test - hash");
}

#
# outside
#

package main;
{
    no strict;
    no warnings qw(once);

    ok(!defined(&C),             "outside - constant");
    ok(!defined(&f),             "outside - function");
    ok(!defined($s),             "outside - scalar");
    ok(!scalar(@a),              "outside - array");
    ok(!scalar(%h),              "outside - hash");
}