Type-Tiny

 view release on metacpan or  search on metacpan

Makefile.PL  view on Meta::CPAN

				Devel::Refcount
				indirect
				match::simple
				Moo
				MooseX::Getopt
				MooseX::Types::Common
				Mouse
				MouseX::Types::Common
				multidimensional
				Object::Accessor
				PadWalker
				Return::Type
				strictures
				Test::Fatal
				Test::LeakTrace
				Test::Requires
				Test::Tester
				Test::Warnings
			);
		if ( $] ge '5.028' ) {
			$meta->{prereqs}{test}{requires}{$_} = '0'

doap.ttl  view on Meta::CPAN

		];
	], [
		a doap-tests:AutomatedTest;
		doap-tests:purpose "Tests Eval::TypeTiny supports alias=>1 using Perl refaliasing.";
		doap-tests:test_script [
			a nfo:FileDataObject, nfo:SourceCode;
			nfo:fileName "t/20-modules/Eval-TypeTiny/aliases-native.t";
		];
	], [
		a doap-tests:AutomatedTest;
		doap-tests:purpose "Tests Eval::TypeTiny supports alias=>1 using PadWalker implementation.";
		doap-tests:test_script [
			a nfo:FileDataObject, nfo:SourceCode;
			nfo:fileName "t/20-modules/Eval-TypeTiny/aliases-padwalker.t";
		];
	], [
		a doap-tests:AutomatedTest;
		doap-tests:purpose "Tests Eval::TypeTiny supports alias=>1 using 'tie()' implementation.";
		doap-tests:test_script [
			a nfo:FileDataObject, nfo:SourceCode;
			nfo:fileName "t/20-modules/Eval-TypeTiny/aliases-tie.t";

lib/Eval/TypeTiny.pm  view on Meta::CPAN

			++$ok if $condition;
		}
		next unless $ok;
		return ref( $result ) eq 'CODE' ? $result->() : ref( $result ) eq 'SCALAR' ? eval( $$result ) : $result;
	}
	return;
}

{
	sub IMPLEMENTATION_DEVEL_LEXALIAS () { 'Devel::LexAlias' }
	sub IMPLEMENTATION_PADWALKER ()      { 'PadWalker' }
	sub IMPLEMENTATION_TIE ()            { 'tie' }
	sub IMPLEMENTATION_NATIVE ()         { 'perl' }
	
	my $implementation;
	
	#<<<
	# uncoverable subroutine
	sub ALIAS_IMPLEMENTATION () {
		$implementation ||= _pick_alternative(
			if    => ( $] ge '5.022' ) => IMPLEMENTATION_NATIVE,
			needs => 'Devel::LexAlias' => IMPLEMENTATION_DEVEL_LEXALIAS,
			needs => 'PadWalker'       => IMPLEMENTATION_PADWALKER,
			if    => !!1               => IMPLEMENTATION_TIE,
		);
	}
	#>>>
	
	sub _force_implementation {
		$implementation = shift;
	}
}

lib/Eval/TypeTiny.pm  view on Meta::CPAN

	my $code = $compiler->( @{ $args{environment} }{@keys} );
	undef( $compiler );
	
	if ( $alias and ALIAS_IMPLEMENTATION eq IMPLEMENTATION_DEVEL_LEXALIAS ) {
		require Devel::LexAlias;
		Devel::LexAlias::lexalias( $code, $_ => $args{environment}{$_} )
			for grep !/^\&/, @keys;
	}
	
	if ( $alias and ALIAS_IMPLEMENTATION eq IMPLEMENTATION_PADWALKER ) {
		require PadWalker;
		my %env = map +( $_ => $args{environment}{$_} ), grep !/^\&/, @keys;
		PadWalker::set_closed_over( $code, \%env );
	}
	
	return $code;
} #/ sub eval_closure

my $tmp;

sub _make_lexical_assignment {
	my ( $key, $index, $alias ) = @_;
	my $name = substr( $key, 1 );

lib/Eval/TypeTiny.pm  view on Meta::CPAN

currently using Perl 5.22's native alias feature. This requires Perl 5.22.

=item C<< IMPLEMENTATION_DEVEL_LEXALIAS >>

If C<< ALIAS_IMPLEMENTATION eq IMPLEMENTATION_DEVEL_LEXALIAS >> then
Eval::TypeTiny is currently using L<Devel::LexAlias> to provide aliases.

=item C<< IMPLEMENTATION_PADWALKER >>

If C<< ALIAS_IMPLEMENTATION eq IMPLEMENTATION_PADWALKER >> then
Eval::TypeTiny is currently using L<PadWalker> to provide aliases.

=item C<< IMPLEMENTATION_TIE >>

If C<< ALIAS_IMPLEMENTATION eq IMPLEMENTATION_TIE >> then Eval::TypeTiny is
using the fallback implementation of aliases using C<tie>. This is the
slowest implementation, and may cause problems in certain edge cases, like
trying to alias already-tied variables, but it's the only way to implement
C<< alias => 1 >> without a recent version of Perl or one of the two optional
modules mentioned above.

t/00-begin.t  view on Meta::CPAN

__END__

Exporter::Tiny
Return::Type
Type::Tiny::XS

Scalar::Util/Sub::Util
Ref::Util/Ref::Util::XS
Regexp::Util
Class::XSAccessor
Devel::LexAlias/PadWalker
Devel::StackTrace

Class::Tiny
Moo/MooX::TypeTiny
Moose/MooseX::Types
Mouse/MouseX::Types

$AUTOMATED_TESTING
$NONINTERACTIVE_TESTING
$EXTENDED_TESTING

t/20-modules/Eval-TypeTiny/aliases-padwalker.t  view on Meta::CPAN

=pod

=encoding utf-8

=head1 PURPOSE

Tests L<Eval::TypeTiny> supports alias=>1 using L<PadWalker>
implementation.

=head1 DEPENDENCIES

Requires PadWalker.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

This software is copyright (c) 2013-2014, 2017-2025 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

use strict;
use warnings;
use lib qw( ./lib ./t/lib ../inc ./inc );

use Test::More;
use Test::Requires 'PadWalker';

use Eval::TypeTiny;

Eval::TypeTiny::_force_implementation( Eval::TypeTiny::IMPLEMENTATION_PADWALKER );

my %env = (
	'$foo' => do { my $x = "foo"; \$x },
	'@bar' => [ "bar" ],
	'%baz' => { "baz" => "1" },
);



( run in 2.017 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )