more minor formating code changes
[gitmo/MooseX-Dependent.git] / lib / MooseX / Meta / TypeCoercion / Parameterizable.pm
CommitLineData
3cfd35fd 1package ## Hide from PAUSE
ca01e833 2 MooseX::Meta::TypeCoercion::Parameterizable;
3cfd35fd 3
4use Moose;
5extends 'Moose::Meta::TypeCoercion';
6
7=head1 NAME
8
88f7dcd2 9MooseX::Meta::TypeCoercion::Parameterizable - Coerce Parameterizable type constraints.
3cfd35fd 10
11=head1 DESCRIPTION
12
91623f94 13This class is not intended for public consumption. Please don't subclass it
14or rely on it. Chances are high stuff here is going to change a lot.
3cfd35fd 15
16=head1 METHODS
17
18This class defines the following methods.
19
0af9bd45 20=head add_type_coercions
26cf337e 21
0af9bd45 22method modification to throw exception should we try to add a coercion on a
88f7dcd2 23parameterizable type that is already defined by a constraining value. We do this
24since defined parameterizable type constraints inherit their coercion from the parent
25constraint. It makes no sense to even be using parameterizable types if you know the
91623f94 26constraining value beforehand!
26cf337e 27
0af9bd45 28=cut
26cf337e 29
30around 'add_type_coercions' => sub {
31 my ($add_type_coercions, $self, @args) = @_;
32 if($self->type_constraint->has_constraining_value) {
88f7dcd2 33 Moose->throw_error("Cannot add type coercions to a parameterizable type constraint that's been defined.");
26cf337e 34 } else {
35 return $self->$add_type_coercions(@args);
36 }
37};
38
0af9bd45 39
91623f94 40## These two are here until I can merge change upstream to Moose. These are two
41## very minor changes we can probably just put into Moose without breaking stuff
1a6ad4bd 42
0af9bd45 43sub coerce {
44 my $self = shift @_;
45 my $coderef = $self->_compiled_type_coercion;
46 return $coderef->(@_);
47}
48
26cf337e 49sub compile_type_coercion {
50 my $self = shift;
51 my @coercion_map = @{$self->type_coercion_map};
52 my @coercions;
53 while (@coercion_map) {
54 my ($constraint_name, $action) = splice(@coercion_map, 0, 2);
1a6ad4bd 55
56 my $type_constraint = ref $constraint_name
57 ? $constraint_name
58 : Moose::Util::TypeConstraints::find_or_parse_type_constraint($constraint_name);
26cf337e 59
60 unless ( defined $type_constraint ) {
61 require Moose;
62 Moose->throw_error("Could not find the type constraint ($constraint_name) to coerce from");
63 }
64
65 push @coercions => [
66 $type_constraint->_compiled_type_constraint,
67 $action
68 ];
69 }
70 $self->_compiled_type_coercion(sub {
71 my $thing = shift;
72 foreach my $coercion (@coercions) {
73 my ($constraint, $converter) = @$coercion;
74 if ($constraint->($thing)) {
75 local $_ = $thing;
76 return $converter->($thing, @_);
77 }
78 }
79 return $thing;
80 });
81}
82
3cfd35fd 83=head1 SEE ALSO
84
85The following modules or resources may be of interest.
86
87L<Moose>, L<Moose::Meta::TypeCoercion>
88
89=head1 AUTHOR
90
91John Napiorkowski, C<< <jjnapiork@cpan.org> >>
92
93=head1 COPYRIGHT & LICENSE
94
95This program is free software; you can redistribute it and/or modify
96it under the same terms as Perl itself.
97
98=cut
99
74eefd2e 100__PACKAGE__->meta->make_immutable(inline_constructor => 0);