in reply to Re^2: Moose type question
in thread Moose type question
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Moose type question
by ikegami (Patriarch) on Jun 15, 2010 at 15:38 UTC | |
by stvn (Monsignor) on Jun 15, 2010 at 17:01 UTC | |
by ikegami (Patriarch) on Jun 15, 2010 at 18:00 UTC |