1 package Moose::Meta::TypeConstraint::Parameterizable;
7 our $VERSION = '0.75_01';
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 unless ( $contained_tc->is_a_type_of($parent->type_parameter) ) {
62 Moose->throw_error("$type_parameter is not a subtype of ".$parent->type_parameter);
67 if ( $contained_tc->isa('Moose::Meta::TypeConstraint') ) {
68 my $tc_name = $self->name . '[' . $contained_tc->name . ']';
69 return Moose::Meta::TypeConstraint::Parameterized->new(
72 type_parameter => $contained_tc,
77 Moose->throw_error("The type parameter must be a Moose meta type");
91 Moose::Meta::TypeConstraint::Parameterizable - Type constraints which can take a parameter (ArrayRef)
95 This class represents a parameterizable type constraint. This is a
96 type constraint like C<ArrayRef> or C<HashRef>, that can be
97 parameterized and made more specific by specifying a contained
98 type. For example, instead of just an C<ArrayRef> of anything, you can
99 specify that is an C<ArrayRef[Int]>.
101 A parameterizable constraint should not be used as an attribute type
102 constraint. Instead, when parameterized it creates a
103 L<Moose::Meta::TypeConstraint::Parameterized> which should be used.
107 C<Moose::Meta::TypeConstraint::Parameterizable> is a subclass of
108 L<Moose::Meta::TypeConstraint>.
112 This class is intentionally not documented because the API is
113 confusing and needs some work.
117 All complex software has bugs lurking in it, and this module is no
118 exception. If you find a bug please either email me, or add the bug
123 Stevan Little E<lt>stevan@iinteractive.comE<gt>
125 =head1 COPYRIGHT AND LICENSE
127 Copyright 2006-2009 by Infinity Interactive, Inc.
129 L<http://www.iinteractive.com>
131 This library is free software; you can redistribute it and/or modify
132 it under the same terms as Perl itself.