bump version and update Changes for release
[gitmo/Moose.git] / lib / Moose / Meta / TypeCoercion / Union.pm
CommitLineData
3726f905 1
2package Moose::Meta::TypeCoercion::Union;
3
4use strict;
5use warnings;
6use metaclass;
7
3726f905 8use Scalar::Util 'blessed';
9
4b2189ce 10our $VERSION = '0.72';
e606ae5f 11$VERSION = eval $VERSION;
3726f905 12our $AUTHORITY = 'cpan:STEVAN';
13
14use base 'Moose::Meta::TypeCoercion';
15
16sub compile_type_coercion {
17 my $self = shift;
18 my $type_constraint = $self->type_constraint;
19
20 (blessed $type_constraint && $type_constraint->isa('Moose::Meta::TypeConstraint::Union'))
c245d69b 21 || Moose->throw_error("You can only a Moose::Meta::TypeCoercion::Union for a " .
4c0b3599 22 "Moose::Meta::TypeConstraint::Union, not a $type_constraint");
3726f905 23
24 $self->_compiled_type_coercion(sub {
25 my $value = shift;
26 # go through all the type constraints
27 # in the union, and check em ...
28 foreach my $type (@{$type_constraint->type_constraints}) {
29 # if they have a coercion first
8de73ff1 30 if ($type->has_coercion) {
3726f905 31 # then try to coerce them ...
32 my $temp = $type->coerce($value);
33 # and if they get something
34 # make sure it still fits within
35 # the union type ...
36 return $temp if $type_constraint->check($temp);
37 }
38 }
39 return undef;
40 });
41}
42
41e007e4 43sub has_coercion_for_type { 0 }
44
45sub add_type_coercions {
70ea9161 46 require Moose;
c245d69b 47 Moose->throw_error("Cannot add additional type coercions to Union types");
41e007e4 48}
49
3726f905 501;
51
52__END__
53
54=pod
55
56=head1 NAME
57
58Moose::Meta::TypeCoercion::Union - The Moose Type Coercion metaclass for Unions
59
60=head1 DESCRIPTION
61
62For the most part, the only time you will ever encounter an
63instance of this class is if you are doing some serious deep
64introspection. This API should not be considered final, but
65it is B<highly unlikely> that this will matter to a regular
66Moose user.
67
68If you wish to use features at this depth, please come to the
69#moose IRC channel on irc.perl.org and we can talk :)
70
71=head1 METHODS
72
73=over 4
74
75=item B<meta>
76
77=item B<compile_type_coercion>
78
41e007e4 79=item B<has_coercion_for_type>
80
81=item B<add_type_coercions>
82
3726f905 83=back
84
85=head1 BUGS
86
87All complex software has bugs lurking in it, and this module is no
88exception. If you find a bug please either email me, or add the bug
89to cpan-RT.
90
91=head1 AUTHOR
92
93Stevan Little E<lt>stevan@iinteractive.comE<gt>
94
95=head1 COPYRIGHT AND LICENSE
96
2840a3b2 97Copyright 2006-2009 by Infinity Interactive, Inc.
3726f905 98
99L<http://www.iinteractive.com>
100
101This library is free software; you can redistribute it and/or modify
102it under the same terms as Perl itself.
103
e606ae5f 104=cut