Type-Tiny-XS

 view release on metacpan or  search on metacpan

lib/Type/Tiny/XS.pm  view on Meta::CPAN

		Any ArrayRef Bool ClassName CodeRef Defined
		FileHandle GlobRef HashRef Int Num Object
		Ref RegexpRef ScalarRef Str Undef Value
		PositiveInt PositiveOrZeroInt NonEmptyStr
		ArrayLike HashLike CodeLike StringLike
		Map Tuple Enum AnyOf AllOf
		/
);
$names{Item} = $names{Any};

if ( $] lt '5.010000' ) {
	require MRO::Compat;
	*Type::Tiny::XS::Util::get_linear_isa = \&mro::get_linear_isa;
	
	my $overloaded = sub {
		require overload;
		overload::Overloaded( ref $_[0] or $_[0] )
			and overload::Method( ( ref $_[0] or $_[0] ), $_[1] );
	};
	
	no warnings qw( uninitialized redefine once );

lib/Type/Tiny/XS.pm  view on Meta::CPAN

		\&{ $names{$type} };
	} if exists $names{$type};
	
	my $made;
	
	if ( $type =~ /^ArrayRef\[(.+)\]$/ ) {
		my $child = get_coderef_for( $1 ) or return;
		$made = _parameterize_ArrayRef_for( $child );
	}
	
	elsif ( $] ge '5.010000' and $type =~ /^ArrayLike\[(.+)\]$/ ) {
		my $child = get_coderef_for( $1 ) or return;
		$made = _parameterize_ArrayLike_for( $child );
	}
	
	elsif ( $type =~ /^HashRef\[(.+)\]$/ ) {
		my $child = get_coderef_for( $1 ) or return;
		$made = _parameterize_HashRef_for( $child );
	}
	
	elsif ( $] ge '5.010000' and $type =~ /^HashLike\[(.+)\]$/ ) {
		my $child = get_coderef_for( $1 ) or return;
		$made = _parameterize_HashLike_for( $child );
	}
	
	elsif ( $type =~ /^Map\[(.+),(.+)\]$/ ) {
		my @children;
		if ( eval { require Type::Parser } ) {
			@children = map scalar( get_coderef_for( $_ ) ), _parse_parameters( $type );
		}
		else {

t/50arraylike.t  view on Meta::CPAN

ok Type::Tiny::XS::ArrayLike([1..3]), '[1..3]';
ok Type::Tiny::XS::ArrayLike($obj), '$obj';
ok !Type::Tiny::XS::ArrayLike($obj2), 'NOT $obj2';
ok !Type::Tiny::XS::ArrayLike({}), 'NOT {}';
ok !Type::Tiny::XS::ArrayLike(1), 'NOT 1';

my $arrayof = Type::Tiny::XS::get_coderef_for('ArrayRef[ArrayLike]');
ok $arrayof->( [ [], [1..3], $obj ] ), '$arrayof : 1';
ok !$arrayof->( [ [], [1..3], $obj, $obj2 ]), '$arrayof : 2';

if ( $] ge 5.010000 ) {
	my $arraylikeof = Type::Tiny::XS::get_coderef_for('ArrayLike[Num]');
	ok(   $arraylikeof->( [ 1..4 ] ) );
	ok( ! $arraylikeof->( [ 1..4, 'foo' ] ) );
	ok(   $arraylikeof->( $obj ) );
	ok( ! $arraylikeof->( bless {}, 'Local::Overload3' ) );
	ok( ! $arraylikeof->( $obj2 ) );
}

done_testing;

t/51hashlike.t  view on Meta::CPAN

ok !Type::Tiny::XS::HashLike($obj), 'NOT $obj';
ok Type::Tiny::XS::HashLike($obj2), '$obj2';
ok Type::Tiny::XS::HashLike({}), '{}';
ok Type::Tiny::XS::HashLike({ bar => 666 }), '{ bar => 666 }';
ok !Type::Tiny::XS::HashLike(1), 'NOT 1';

my $arrayof = Type::Tiny::XS::get_coderef_for('ArrayRef[HashLike]');
ok $arrayof->( [ {}, {bar=>666}, $obj2 ] ), '$arrayof : 1';
ok !$arrayof->( [ {}, {bar=>666}, $obj ]), '$arrayof : 2';

if ( $] ge 5.010000 ) {
	my $hashlikeof = Type::Tiny::XS::get_coderef_for('HashLike[Num]');
	ok(   $hashlikeof->( { 1..4 } ) );
	ok( ! $hashlikeof->( { 1..4, xyz => 'foo' } ) );
	ok( ! $hashlikeof->( $obj ) );
	ok(   $hashlikeof->( $obj2 ) );
	ok( ! $hashlikeof->( bless [], 'Local::Overload3' ) );
	ok( ! $hashlikeof->( [] ) );
	ok(   $hashlikeof->( {} ) );
}



( run in 2.321 seconds using v1.01-cache-2.11-cpan-5c0b1e786e0 )