bump version to 0.26
[gitmo/MooseX-Types.git] / lib / MooseX / Types / UndefinedType.pm
1 package MooseX::Types::UndefinedType;
2 our $VERSION = "0.26";
3
4 =head1 NAME
5
6 MooseX::Types::UndefinedType - Represents a not yet defined type
7
8 =cut
9
10 use warnings;
11 use strict;
12
13 use Moose::Util::TypeConstraints ();
14 use Carp::Clan qw( ^MooseX::Types );
15
16 use overload '""'     => sub { shift->name },
17              fallback => 1;
18
19 =head1 DESCRIPTION
20
21 Whenever a type handle function (e.g. C<Int()> can't find a type 
22 constraint under it's full name, it assumes it has not yet been defined.
23 It will then return an instance of this class, handling only 
24 stringification, name and possible identification of undefined types.
25
26 Later, when you try to use the Undefined Type Constraint, autovivification will
27 be attempted.
28
29 =head1 METHODS
30
31 =head2 new
32
33 Takes a full type name as argument and returns an instance of this
34 class.
35
36 =cut
37
38 sub new {
39     return bless { name => $_[1] }, $_[0];
40 }
41
42 =head2 name
43
44 Returns the stored type name.
45
46 =cut
47
48 sub name {
49     return $_[0]->{name};
50 }
51
52 =head2 can_be_inlined
53
54 Always returns false. Needed for compatbility with Moose 2.0100+.
55
56 =cut
57
58 sub can_be_inlined { 0 }
59
60 =head2 __autovivify
61
62 Try to see if the type constraint has yet been defined and if so create it.
63
64 =cut
65
66 sub __autovivify {
67     my ($self) = @_;
68     if(my $tc = $self->{instance}) {
69         return $tc;
70     } elsif( my $new_tc = Moose::Util::TypeConstraints::find_type_constraint($self->name)) {
71         $self->{instance} = $new_tc;
72         return $new_tc;
73     } else {
74         return;
75     }
76 }
77
78 =head2 AUTOLOAD
79
80 Try to autovivify and delegate
81
82 =cut
83
84 sub AUTOLOAD {
85     my ($self, @args)  = @_;
86     my ($method) = our $AUTOLOAD =~ /([^:]+)$/;    
87
88     if(my $type_constraint = $self->__autovivify) {
89         return $type_constraint->$method(@args);
90     } else {
91         croak "Method '$method' is not supported for " . $self->name;
92     }
93 }
94
95 =head2 DESTROY
96
97 Moose::Meta::TypeConstraint::Parameterizable complains if this isn't here. TODO
98 to find out why.
99
100 =cut
101
102 sub DESTROY {
103     return;
104 }
105
106 =head1 SEE ALSO
107
108 L<MooseX::Types::Moose>,
109 L<Moose::Util::TypeConstraints>, 
110 L<Moose::Meta::TypeConstraint>,
111 L<Carp::Clan>
112
113 =head1 AUTHOR
114
115 See L<MooseX::Types/AUTHOR>.
116
117 =head1 LICENSE
118
119 This program is free software; you can redistribute it and/or modify
120 it under the same terms as perl itself.
121
122 =cut
123
124
125 1;