
use Test::More tests=>15; {
    
    use strict;
    use warnings;

    use MooseX::Types::Parameterizable qw(Parameterizable);
    use MooseX::Types::Moose qw(Int Str HashRef ArrayRef);
    
    use MooseX::Types -declare=>[qw(
        InfoHash OlderThanAge DefinedOlderThanAge
    )];
    
    ok subtype( InfoHash,
        as HashRef[Int],
        where {
            defined $_->{older_than};
        }), 'Created InfoHash Set (reduce need to depend on Dict type';

    ok InfoHash->check({older_than=>25}), 'Good InfoHash';
    ok !InfoHash->check({older_than=>'aaa'}), 'Bad InfoHash';
    ok !InfoHash->check({at_least=>25}), 'Bad InfoHash';
    
    ok subtype( OlderThanAge,
        as Parameterizable[Int, InfoHash],
        where {
            my ($value, $dict) = @_;
            return $value > $dict->{older_than} ? 1:0;
        }), 'Created the OlderThanAge subtype';
    
    ok OlderThanAge([{older_than=>25}])->check(39), '39 is older than 25';
    ok OlderThanAge([older_than=>1])->check(9), '9 is older than 1';
    ok !OlderThanAge([older_than=>1])->check('aaa'), '"aaa" not an int';
    ok !OlderThanAge([older_than=>10])->check(9), '9 is not older than 10';
        
    coerce OlderThanAge,
        from HashRef,
        via { 
            my ($hashref, $constraining_value) = @_;
            return scalar(keys(%$hashref));
        },
        from ArrayRef,
        via { 
            my ($arrayref, $constraining_value) = @_;
            #use Data::Dump qw/dump/; warn dump $constraining_value;
            my $age;
            $age += $_ for @$arrayref;
            return $age;
        };

    is OlderThanAge->name, 'main::OlderThanAge',
      'Got corect name for OlderThanAge';
    is OlderThanAge([older_than=>5])->coerce([1..10]), 55,
      'Coerce works';
    is OlderThanAge([older_than=>5])->coerce({a=>1,b=>2,c=>3,d=>4}), 4,
      'Coerce works';      
    like OlderThanAge([older_than=>2])->name, qr/main::OlderThanAge\[/,
      'Got correct name for OlderThanAge([older_than=>2])';
    is OlderThanAge([older_than=>2])->coerce({a=>5,b=>6,c=>7,d=>8}), 4,
      'Coerce works';

    SKIP: {
        skip 'Type Coercions on defined types not supported yet', 1;

        subtype DefinedOlderThanAge, as OlderThanAge([older_than=>1]);
        
        coerce DefinedOlderThanAge,
            from ArrayRef,
            via {
                my ($arrayref, $constraining_value) = @_;
                my $age;
                $age += $_ for @$arrayref;
                return $age;
            };
        
        is DefinedOlderThanAge->coerce([1,2,3]), 6, 'Got expected Value';
    }
}
