Devel::TypeCheck is one of those projects I desperately want to see gain some traction, but it hasn't. Part of the reason for this is the following code from B::TypeCheck (which, believe it or not, is formatted for clarity):
# Fully qualified terminal types our $IO = Devel::TypeCheck::Type::Mu->new( Devel::TypeCheck::Type::Io->new() ); our $PV = Devel::TypeCheck::Type::Mu->new( Devel::TypeCheck::Type::Kappa->new( Devel::TypeCheck::Type::Upsilon->new( Devel::TypeCheck::Type::Pv->new() ) ) ); our $IV = Devel::TypeCheck::Type::Mu->new( Devel::TypeCheck::Type::Kappa->new( Devel::TypeCheck::Type::Upsilon->new( Devel::TypeCheck::Type::Nu->new( Devel::TypeCheck::Type::Iv->new() ) ) ) ); our $DV = Devel::TypeCheck::Type::Mu->new( Devel::TypeCheck::Type::Kappa->new( Devel::TypeCheck::Type::Upsilon->new( Devel::TypeCheck::Type::Nu->new( Devel::TypeCheck::Type::Dv->new() ) ) ) );
OK, got that? Just to give you a heads up, Devel::TypeCheck::Type::Kappa, according to the docs, is a type representing a scalar. Using this information and judicious use of the aliased module, we can do this:
use aliased 'Devel::TypeCheck::Type::Kappa', 'Scalar';
Which will allow us to do this:
# Fully qualified terminal types our $IO = All->new( IO->new() ); our $PV = All->new( Scalar->new( Printable->new( String->new() ) ) ); our $IV = All->new( Scalar->new( Printable->new( Number->new( Integer->new() ) ) ) ); our $DV = All->new( Scalar->new( Printable->new( Number->new( Double->new() ) ) ) );
Now that's still tough to see exactly where this is going, but it's much more readable. I suspect that if this is the code we saw, some intrepid folks might actually submit patches to get Devel::TypeCheck to work on something other than 5.8.1.
Mind you, type inference really can't work on Perl 5, but we might get an 80% solution. The work is on the CPAN (it was a Summer of Code project) and I'd love to see where this could take us.