Exporter-Almighty

 view release on metacpan or  search on metacpan

lib/Exporter/Almighty.pm  view on Meta::CPAN

use 5.012;
use strict;
use warnings;

package Exporter::Almighty;

our $AUTHORITY = 'cpan:TOBYINK';
our $VERSION   = '0.001005';

use parent qw( Exporter::Tiny );

my @builtins;
BEGIN { @builtins = qw( is_bool created_as_string created_as_number ) };
use if $] lt '5.036000', 'builtins::compat' => @builtins;
use if $] ge '5.036000', 'builtin' => @builtins;
no if $] ge '5.036000', 'warnings' => qw( experimental::builtin );

use B                 qw( perlstring );
use Carp              qw( croak );
use Eval::TypeTiny    qw( eval_closure set_subname );
use Exporter::Tiny    qw( mkopt );
use Import::Into;
use Module::Runtime   qw( require_module module_notional_filename );
use Type::Registry    qw();
use Types::Common     qw(
	-sigs
	-types
	assert_Ref       is_Ref
	assert_ArrayRef  is_ArrayRef
	assert_HashRef   is_HashRef
	is_NonEmptySimpleStr
);

sub _exporter_validate_opts {
	my ( $me, $options ) = @_;
	my $into  = $options->{into};
	my $setup = $options->{setup};
	strict->import::into( $into );
	warnings->import::into( $into );
	$me->setup_for( $into, $setup );
}

# Subclasses may wish to provide a subclass of Exporter::Tiny here.
sub base_exporter {
	return 'Exporter::Tiny';
}

sub standard_package_variables {
	my ( $me, $into ) = @_;
	no strict 'refs';
	return (
		\@{"$into\::ISA"},
		\@{"$into\::EXPORT"},
		\@{"$into\::EXPORT_OK"},
		\%{"$into\::EXPORT_TAGS"},
	);
}

signature_for setup_for => (
	method  => 1,
	head    => [ NonEmptySimpleStr ],
	named   => [
		tag    => Optional[HashRef],
		also   => Optional[ArrayRef],
		enum   => Optional[HashRef[ArrayRef]],
		class  => Optional[ArrayRef],
		role   => Optional[ArrayRef],
		duck   => Optional[HashRef[ArrayRef]],
		type   => Optional[ArrayRef],
		const  => Optional[HashRef],
	],
);

sub setup_for {
	my ( $me, $into, $setup ) = @_;
	$INC{ module_notional_filename($into) } //= __FILE__;
	my @steps = $me->steps( $into, $setup );
	for my $step ( @steps ) {
		$me->$step( $into, $setup );
	}
	return;
}

# Subclasses can wrap this to easily add and remove steps.
sub steps {
	my ( $me, $into, $setup ) = @_;
	my @steps;
	push @steps, 'setup_exporter_for';
	push @steps, 'setup_reexports_for'            if $setup->{also};
	push @steps, 'setup_enums_for'                if $setup->{enum};
	push @steps, 'setup_classes_for'              if $setup->{class};
	push @steps, 'setup_roles_for'                if $setup->{role};
	push @steps, 'setup_ducks_for'                if $setup->{duck};
	push @steps, 'setup_types_for'                if $setup->{type};
	push @steps, 'setup_constants_for'            if $setup->{const};
	push @steps, 'setup_readonly_vars_for';
	push @steps, 'finalize_export_variables_for';
	return @steps;



( run in 3.304 seconds using v1.01-cache-2.11-cpan-f56aa216473 )