1 package Moose::Meta::TypeConstraint::Parameterizable;
8 $VERSION = eval $VERSION;
9 our $AUTHORITY = 'cpan:STEVAN';
11 use base 'Moose::Meta::TypeConstraint';
12 use Moose::Meta::TypeConstraint::Parameterized;
13 use Moose::Util::TypeConstraints ();
15 __PACKAGE__->meta->add_attribute('constraint_generator' => (
16 accessor => 'constraint_generator',
17 predicate => 'has_constraint_generator',
20 sub generate_constraint_for {
21 my ($self, $type) = @_;
23 return unless $self->has_constraint_generator;
25 return $self->constraint_generator->($type->type_parameter)
26 if $type->is_subtype_of($self->name);
28 return $self->_can_coerce_constraint_from($type)
29 if $self->has_coercion
30 && $self->coercion->has_coercion_for_type($type->parent->name);
35 sub _can_coerce_constraint_from {
36 my ($self, $type) = @_;
37 my $coercion = $self->coercion;
38 my $constraint = $self->constraint_generator->($type->type_parameter);
40 local $_ = $coercion->coerce($_);
45 sub _parse_type_parameter {
46 my ($self, $type_parameter) = @_;
47 return Moose::Util::TypeConstraints::find_or_create_isa_type_constraint($type_parameter);
51 my ($self, $type_parameter) = @_;
53 my $contained_tc = $self->_parse_type_parameter($type_parameter);
55 ## The type parameter should be a subtype of the parent's type parameter
58 if(my $parent = $self->parent) {
59 if($parent->can('type_parameter')) {
60 $contained_tc->is_a_type_of($parent->type_parameter)
61 || Moose->throw_error("$type_parameter is not a subtype of ".$parent->type_parameter);
65 if ( $contained_tc->isa('Moose::Meta::TypeConstraint') ) {
66 my $tc_name = $self->name . '[' . $contained_tc->name . ']';
67 return Moose::Meta::TypeConstraint::Parameterized->new(
70 type_parameter => $contained_tc,
74 Moose->throw_error("The type parameter must be a Moose meta type");
88 Moose::Meta::TypeConstraint::Parameterizable - Higher Order type constraints for Moose
94 =item B<constraint_generator>
96 =item B<has_constraint_generator>
98 =item B<generate_constraint_for>
100 =item B<parameterize>
102 Given a single type constraint or type constraint string, this method
103 parameterizes the type based on the given argument.
111 All complex software has bugs lurking in it, and this module is no
112 exception. If you find a bug please either email me, or add the bug
117 Stevan Little E<lt>stevan@iinteractive.comE<gt>
119 =head1 COPYRIGHT AND LICENSE
121 Copyright 2006-2009 by Infinity Interactive, Inc.
123 L<http://www.iinteractive.com>
125 This library is free software; you can redistribute it and/or modify
126 it under the same terms as Perl itself.