#!/usr/bin/perl
use strict;
use warnings;
use Fennec::Lite;
use aliased 'Exporter::Declare::Meta';
use aliased 'Exporter::Declare::Specs';
use aliased 'Exporter::Declare::Export::Sub';
use aliased 'Exporter::Declare::Export::Variable';
our $CLASS;
our @IMPORTS;
BEGIN {
@IMPORTS = qw/
export gen_export default_export gen_default_export import export_to
exports default_exports reexport import_options import_arguments
export_tag
/;
$CLASS = "Exporter::Declare";
require_ok $CLASS;
$CLASS->import( '-alias', @IMPORTS );
}
sub xxx {'xxx'}
tests package_usage => sub {
can_ok( $CLASS, 'export_meta' );
can_ok( __PACKAGE__, @IMPORTS, 'Declare' );
can_ok( __PACKAGE__, 'export_meta' );
is( Declare(), $CLASS, "Aliased" );
is_deeply(
[ sort( Declare()->exports )],
[ sort map {"\&$_" } @IMPORTS, 'Declare' ],
"Export list"
);
is_deeply(
[ sort( Declare()->default_exports )],
[ sort qw/
exports default_exports import import_options import_arguments
export_tag default_export export gen_export gen_default_export
/],
"Default Exports"
);
};
{
package Export::Stuff;
use Exporter::Declare;
sub a { 'a' }
sub b { 'b' }
sub c { 'c' }
sub meth { return @_ }
our $X = 'x';
our $Y = 'y';
our $Z = 'z';
exports qw/ $Y b /;
default_exports qw/ $X a /;
import_options qw/xxx yyy/;
import_arguments qw/ foo bar /;
export_tag vars => qw/ $X $Y @P /;
export_tag subs => qw/ a b /;
export '$Z';
export '@P' => [ 'a', 'x' ];
export 'c';
export baz => sub { 'baz' };
my $gen = 0;
gen_export gexp => sub { my $out = $gen++; sub { $out }};
gen_default_export defgen => sub { my $out = $gen++; sub { $out }};
}
tests generator => sub {
Export::Stuff->import(qw/gexp/);
is( gexp(), 0, "Generated first" );
Export::Stuff->import(qw/defgen/);
is( defgen(), 1, "Generated second" );
Export::Stuff->import( defgen => { -as => 'blah' });
is( blah(), 2, "Generated again" );
};
tests tags_options_and_exports => sub {
is_deeply(
[ sort keys %{ Export::Stuff->export_meta->exports }],
[ sort qw/ $Y &b $X &a &Stuff $Z &c &baz &gexp &defgen @P /],
"All exports accounted for"
);
is_deeply(
[ sort @{ Export::Stuff->export_meta->export_tags->{default} }],
[ sort qw/ $X a defgen /],
"Default Exports"
);
is_deeply(
[ sort @{ Export::Stuff->export_meta->export_tags->{all} }],
[ sort qw/ $Y &b $X &a &Stuff $Z &c &baz &gexp &defgen @P /],
"All Exports"
);
is_deeply(
Export::Stuff->export_meta->options,
{
xxx => 1,
yyy => 1,
},
"Options"
);
is_deeply(
Export::Stuff->export_meta->arguments,
{
foo => 1,
bar => 1,
prefix => 1,
suffix => 1,
},
"Arguments"
);
is_deeply(
Export::Stuff->export_meta->export_tags,
{
alias => [ 'Stuff' ],
vars => [qw/ $X $Y @P /],
subs => [qw/ a b /],
# These are checked elsware
default => Export::Stuff->export_meta->export_tags->{'default'},
all => Export::Stuff->export_meta->export_tags->{all}
},
"Extra tags"
);
isa_ok( Export::Stuff->export_meta->exports_get( '@P' ), 'ARRAY' );
is_deeply(
[@{ Export::Stuff->export_meta->exports_get( '@P' ) }],
[ 'a', 'x' ],
"\@P Is what we expect"
);
};
run_tests;
done_testing;