type-coercion-meta-object
[gitmo/Moose.git] / lib / Moose / Meta / TypeConstraint.pm
1
2 package Moose::Meta::TypeConstraint;
3
4 use strict;
5 use warnings;
6 use metaclass;
7
8 use Sub::Name 'subname';
9 use Carp      'confess';
10
11 our $VERSION = '0.01';
12
13 __PACKAGE__->meta->add_attribute('name'       => (reader => 'name'      ));
14 __PACKAGE__->meta->add_attribute('parent'     => (reader => 'parent'    ));
15 __PACKAGE__->meta->add_attribute('constraint' => (reader => 'constraint'));
16 __PACKAGE__->meta->add_attribute('coercion'   => (
17     accessor  => 'coercion',
18     predicate => 'has_coercion'
19 ));
20
21 # private accessor
22 __PACKAGE__->meta->add_attribute('compiled_type_constraint' => (
23     accessor => '_compiled_type_constraint'
24 ));
25
26 sub new { 
27     my $class = shift;
28     my $self  = $class->meta->new_object(@_);
29     $self->compile_type_constraint();
30     return $self;
31 }
32
33 sub compile_type_constraint () {
34     my $self  = shift;
35     my $check = $self->constraint;
36     (defined $check)
37         || confess "Could not compile type constraint '" . $self->name . "' because no constraint check";
38     my $parent = $self->parent;
39     if (defined $parent) {
40         # we have a subtype ...
41         $parent = $parent->_compiled_type_constraint;
42                 $self->_compiled_type_constraint(subname $self->name => sub {                   
43                         local $_ = $_[0];
44                         return undef unless defined $parent->($_[0]) && $check->($_[0]);
45                         $_[0];
46                 });        
47     }
48     else {
49         # we have a type ....
50         $self->_compiled_type_constraint(subname $self->name => sub { 
51                 local $_ = $_[0];
52                 return undef unless $check->($_[0]);
53                 $_[0];
54         });
55     }
56 }
57
58 sub check { $_[0]->_compiled_type_constraint->($_[1]) }
59
60 1;
61
62 __END__
63
64 =pod
65
66 =head1 NAME
67
68 Moose::Meta::TypeConstraint - The Moose Type Constraint metaobject
69
70 =head1 SYNOPSIS
71
72 =head1 DESCRIPTION
73
74 =head1 METHODS
75
76 =over 4
77
78 =item B<meta>
79
80 =item B<new>
81
82 =item B<name>
83
84 =item B<parent>
85
86 =item B<check>
87
88 =item B<constraint>
89
90 =item B<has_coercion>
91
92 =item B<coercion>
93
94 =item B<compile_type_constraint>
95
96 =back
97
98 =head1 BUGS
99
100 All complex software has bugs lurking in it, and this module is no 
101 exception. If you find a bug please either email me, or add the bug
102 to cpan-RT.
103
104 =head1 AUTHOR
105
106 Stevan Little E<lt>stevan@iinteractive.comE<gt>
107
108 =head1 COPYRIGHT AND LICENSE
109
110 Copyright 2006 by Infinity Interactive, Inc.
111
112 L<http://www.iinteractive.com>
113
114 This library is free software; you can redistribute it and/or modify
115 it under the same terms as Perl itself. 
116
117 =cut