That sounds like a union, so I tried it. Coercion works! ...but constraints don't?! Am I missing something?
It is not a union, it is an algebraic data type, there is a HUGE difference in terms of type safety and soundness.
Your second "Simple demonstration" seems to be a bug, I have brought it up in #moose-dev to discuss.
UPDATE:
Actually we figured out what is happening there, it is a fall through on an edge case. So if you look at this:
You will get Use of uninitialized value in print at -e line 3., which is happening because when Moose::Meta::TypeCoercion::Union attempts to coerce and doesnt find a proper coercion it returns 'undef'. Which in most cases would cause a type-check failure, but here actually passes the type check just fine.perl -Moose -e'has a=>(is=>"rw",isa=>"Undef|Undef",coerce=>1); my $x = + __PACKAGE__->new(a=>"abc"); print $x->a'
Funny, because this perfectly illustrates why I really don't like undef. In this case we are trying to use it as a "no value", but your test case is using it as a valid value itself. The two ways of using it do not mesh well at all.
UPDATE(2):
See also Semipredicate Problem.
In reply to Re^3: Moose type question
by stvn
in thread Moose type question
by Sue D. Nymme
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |