bump version and update changes for next release
[gitmo/Moose.git] / lib / Moose / Manual / Types.pod
CommitLineData
ecd7cc3e 1=pod
2
3=head1 NAME
4
d67ce58f 5Moose::Manual::Types - Moose's type system
ecd7cc3e 6
7=head1 TYPES IN PERL?
8
0c551c67 9Moose provides its own type system for attributes. You can also use
10these types to validate method parameters with the help of a MooseX
11module.
ecd7cc3e 12
13Moose's type system is based on a combination of Perl 5's own
0c551c67 14I<implicit> types and some Perl 6 concepts. You can easily create your
15own subtypes with custom constraints, making it easy to express any
16sort of validation.
ecd7cc3e 17
0c551c67 18Types have names, and you can re-use them by name, making it easy to
ecd7cc3e 19share types throughout a large application.
20
21Let us be clear that is not a "real" type system. Moose does not
0c551c67 22magically make Perl start associating types with variables. This is
23just an advanced parameter checking system which allows you to
24associate a name with a constraint.
ecd7cc3e 25
26That said, it's still pretty damn useful, and we think it's one of the
27things that makes Moose both fun and powerful. Taking advantage of the
28type system makes it much easier to ensure that you are getting valid
29data, and it also contributes greatly to code maintainability.
30
31=head1 THE TYPES
32
33The basic Moose type hierarchy looks like this
34
35 Any
36 Item
37 Bool
38 Maybe[`a]
39 Undef
40 Defined
41 Value
42 Num
43 Int
44 Str
45 ClassName
46 Ref
47 ScalarRef
48 ArrayRef[`a]
49 HashRef[`a]
50 CodeRef
51 RegexpRef
52 GlobRef
53 FileHandle
54 Object
55 Role
56
57In practice, the only difference between C<Any> and C<Item> is
58conceptual. C<Item> is used as the top-level type in the hierarchy.
59
60The rest of these types correspond to existing Perl concepts. For
61example, a C<Num> is anything that Perl thinks looks like a number. An
62C<Object> is a blessed reference, etc.
63
64The types followed by "[`a]" can be parameterized. So instead of just
65plain C<ArrayRef> we can say that we want C<ArrayRef[Int]> instead. We
66can even do something like C<HashRef[ArrayRef[Str]]>.
67
68The C<Maybe[`a]> type deserves a special mention. Used by itself, it
69doesn't really mean anything (and is equivalent to C<Item>). When it
70is parameterized, it means that the value is either C<undef> or the
71parameterized type. So C<Maybe[Int]> means an integer or C<undef>
72
73For more details on the type hierarchy, see
74L<Moose::Util::TypeConstraints>.
75
76=head1 WHAT IS A TYPE?
77
78It's important to realize that types are not classes (or
79packages). Types are just objects (L<Moose::Meta::TypeConstraint>
0c551c67 80objects, to be exact) with a name and a constraint. Moose maintains a
81global type registry that lets it convert names like "Num" into the
82appropriate object.
ecd7cc3e 83
84However, class names I<can be> type names. When you define a new class
85using Moose, it defines an associated type name behind the scenes:
86
87 package MyApp::User;
88
89 use Moose;
90
91Now you can use C<'MyApp::User'> as a type name:
92
93 has creator => (
94 is => 'rw',
95 isa => 'MyApp::User',
96 );
97
98However, for non-Moose classes there's no magic. You may have to
99explicitly declare the class type. This is a bit muddled because Moose
100assumes that any unknown type name passed as the C<isa> value for an
101attribute is a class. So this works:
102
103 has 'birth_date' => (
104 is => 'rw',
105 isa => 'DateTime',
106 );
107
108In general, when Moose is presented with an unknown name, it assumes
109that the name is a class:
110
111 subtype 'ModernDateTime'
112 => as 'DateTime'
113 => where { $_->year() >= 1980 }
114 => message { 'The date you provided is not modern enough' };
115
116 has 'valid_dates' => (
117 is => 'ro',
118 isa => 'ArrayRef[DateTime]',
119 );
120
0c39debe 121Moose will assume that C<DateTime> is a class name in both of these
0c551c67 122instances.
ecd7cc3e 123
124=head1 SUBTYPES
125
126Moose uses subtypes in its built-in hierarchy. C<Int> is a child of
127C<Num> for example.
128
129A subtype is defined in terms of a parent type and a constraint. Any
130constraints defined by the parent(s) will be checked first, and then
0c39debe 131the the subtype's. A value must pass I<all> of these checks to be
0c551c67 132valid for the subtype.
ecd7cc3e 133
0c551c67 134Typically, a subtype takes the parent's constraint and makes it more
ecd7cc3e 135specific.
136
137A subtype can also define its own constraint failure message. This
138lets you do things like have an error "The value you provided (20),
139was not a valid rating, which must be a number from 1-10." This is
140much friendlier than the default error, which just says that the value
141failed a validation check for the type.
142
143Here's a simple (and useful) subtype example:
144
145 subtype 'PositiveInt'
146 => as 'Int'
147 => where { $_ > 0 }
148 => message { "The number you provided, $_, was not a positive number" }
149
150Note that the sugar functions for working with types are all exported
151by L<Moose::Util::TypeConstraints>.
152
d67ce58f 153=head2 Creating a new type (that isn't a subtype)
ecd7cc3e 154
155You can also create new top-level types:
156
157 type 'FourCharacters' => where { defined $_ && length $_ == 4 };
158
0c551c67 159In practice, this example is more or less the same as subtyping
636f25f3 160C<Str>, except you have to check definedness yourself.
ecd7cc3e 161
162It's hard to find a case where you wouldn't want to subtype a very
163broad type like C<Defined>, C<Ref> or C<Object>.
164
0c551c67 165Defining a new top-level type is conceptually the same as subtyping
166C<Item>.
ecd7cc3e 167
168=head1 TYPE NAMES
169
170Type names are global throughout the current Perl
0c551c67 171interpreter. Internally, Moose maps names to type objects via a
172L<registry|Moose::Meta::TypeConstraint::Registry>.
ecd7cc3e 173
174If you have multiple apps or libraries all using Moose in the same
175process, you could have problems with collisions. We recommend that
176you prefix names with some sort of namespace indicator to prevent
177these sorts of collisions.
178
179For example, instead of calling a type "PositiveInt", call it
180"MyApp.Type.PositiveInt".
181
0c551c67 182Type names are just strings. We recommend that you I<do not> use "::"
183as a separator in type names. This can be very confusing, because
184class names are I<also> valid type names! Using something else, like a
185period, makes it clear that "MyApp::User" is a class and
186"MyApp.Type.PositiveInt" is a Moose type defined by your application.
ecd7cc3e 187
0c39debe 188The L<MooseX::Types> module lets you create bareword aliases to longer
0c551c67 189names and also automatically namespaces all the types you define.
ecd7cc3e 190
191=head1 COERCION
192
193One of the most powerful features of Moose's type system is its
0c551c67 194coercions. A coercion is a way to convert from one type to another.
ecd7cc3e 195
196 subtype 'ArrayRefOfInts'
197 => as 'ArrayRef[Int]';
198
199 coerce 'ArrayRefOfInts'
200 => from 'Int'
201 => via { [ $_ ] };
202
203You'll note that we had to create a subtype rather than coercing
204C<ArrayRef[Int]> directly. This is just a quirk of how Moose
205works.
206
207Coercions, like type names, are global. This is I<another> reason why
208it is good to namespace your types. Moose will I<never> try to coerce
209a value unless you explicitly ask for it. This is done by setting the
210C<coerce> attribute parameter to a true value:
211
212 package Foo;
213
214 has 'sizes' => (
215 is => 'rw',
216 isa => 'ArrayRefOfInts',
217 coerce => 1,
218 );
219
220 Foo->new( sizes => 42 );
221
222This code example will do the right thing, and the newly created
223object will have C<[ 42 ]> as its C<sizes> attribute.
224
d67ce58f 225=head2 Deep coercion
ecd7cc3e 226
227Deep coercion is the coercion of type parameters for parameterized
228types. Let's take these types as an example:
229
230 subtype 'HexNum'
231 => as 'Str'
232 => where { /[a-f0-9]/i };
233
234 coerce 'Int'
235 => from 'HexNum'
236 => via { hex $_ };
237
238 has 'sizes' => (
239 is => 'rw',
240 isa => 'ArrayRef[Int]',
241 coerce => 1,
242 );
243
244If we try passing an array reference of hex numbers for the C<sizes>
0c551c67 245attribute, Moose will not do any coercion.
ecd7cc3e 246
0c551c67 247However, you can define a set of subtypes to enable coercion between
248two parameterized types.
ecd7cc3e 249
250 subtype 'ArrayRefOfHexNums'
251 => as 'ArrayRef[HexNum]';
252
253 subtype 'ArrayRefOfInts'
254 => as 'ArrayRef[Int]';
255
256 coerce 'ArrayRefOfInts'
257 => from 'ArrayRefOfHexNums'
258 => via { [ map { hex } @{$_} ] };
259
260 Foo->new( sizes => [ 'a1', 'ff', '22' ] );
261
262Now Moose will coerce the hex numbers to integers.
263
0c551c67 264However, Moose does not attempt to chain coercions, so it will not
265coerce a single hex number. To do that, we need to define a separate
266coercion:
ecd7cc3e 267
268 coerce 'ArrayRefOfInts'
269 => from 'HexNum'
270 => via { [ hex $_ ] };
271
272Yes, this can all get verbose, but coercion is tricky magic, and we
0c551c67 273think it's best to make it explicit.
ecd7cc3e 274
275=head1 TYPE UNIONS
276
277Moose allows you to say that an attribute can be of two or more
278disparate types. For example, we might allow an C<Object> or
279C<FileHandle>:
280
281 has 'output' => (
282 is => 'rw',
283 isa => 'Object | FileHandle',
284 );
285
286Moose actually parses that string and recognizes that you are creating
287a type union. The C<output> attribute will accept any sort of object,
288as well as an unblessed file handle. It is up to you to do the right
289thing for each of them in your code.
290
0c551c67 291Whenever you use a type union, you should consider whether or not
292coercion might be a better answer.
ecd7cc3e 293
294For our example above, we might want to be more specific, and insist
295that output be an object with a C<print> method:
296
297 subtype 'CanPrint'
298 => as 'Object'
299 => where { $_->can('print') };
300
301We can coerce file handles to an object that satisfies this condition
302with a simple wrapper class:
303
304 package FHWrapper;
305
306 use Moose;
307
308 has 'handle' => (
309 is => 'ro',
310 isa => 'FileHandle',
311 );
312
313 sub print {
314 my $self = shift;
315 my $fh = $self->handle();
316
317 print $fh @_;
318 }
319
320Now we can define a coercion from C<FileHandle> to our wrapper class:
321
0c551c67 322 coerce 'CanPrint'
ecd7cc3e 323 => from 'FileHandle'
324 => via { FHWrapper->new( handle => $_ ) };
325
326 has 'output' => (
327 is => 'rw',
328 isa => 'CanPrint',
329 coerce => 1,
330 );
331
0c551c67 332This pattern of using a coercion instead of a type union will help
333make your class internals simpler.
ecd7cc3e 334
335=head1 TYPE CREATION HELPERS
336
337The L<Moose::Util::TypeConstraints> module exports a number of helper
338functions for creating specific kinds of types. These include
339C<class_type>, C<role_type>, and C<maybe_type>. See the docs for
340details.
341
342One helper worth noting is C<enum>, which allows you to create a
343subtype of C<Str> that only allows the specified values:
344
345 enum 'RGB' => qw( red green blue );
346
347This creates a type named C<RGB>
348
349=head1 ANONYMOUS TYPES
350
351All of the type creation functions return a type object. This type
352object can be used wherever you would use a type name, as a parent
353type, or as the value for an attribute's C<isa> parameter:
354
355 has 'size' => (
356 is => 'rw',
357 isa => subtype 'Int' => where { $_ > 0 },
358 );
359
360This is handy when you want to create a one-off type and don't want to
361"pollute" the global namespace registry.
362
363=head1 VALIDATING METHOD PARAMETERS
364
365Moose does not provide any means of validating method
366parameters. However, there are several MooseX extensions on CPAN which
367let you do this.
368
0c39debe 369The simplest and least sugary is L<MooseX::Params::Validate>. This
ecd7cc3e 370lets you validate a set of named parameters using Moose types:
371
372 use Moose;
373 use MooseX::Params::Validate;
374
375 sub foo {
376 my $self = shift;
0c551c67 377 my %params = validated_hash(
ecd7cc3e 378 \@_,
379 bar => { isa => 'Str', default => 'Moose' },
380 );
381 ...
382 }
383
0c39debe 384L<MooseX::Params::Validate> also supports coercions.
ecd7cc3e 385
386There are several more powerful extensions that support method
387parameter validation using Moose types, including
0c39debe 388L<MooseX::Method::Signatures>, which gives you a full-blown C<method>
ecd7cc3e 389keyword.
390
391 method morning (Str $name) {
392 $self->say("Good morning ${name}!");
393 }
394
ca680d1f 395=head1 LOAD ORDER ISSUES
396
0c551c67 397Because Moose types are defined at runtime, you may run into load
398order problems. In particular, you may want to use a class's type
399constraint before that type has been defined.
ca680d1f 400
0c551c67 401We have several recommendations for ameliorating this problem. First,
402define I<all> of your custom types in one module,
403C<MyApp::Types>. Second, load this module in all of your other
404modules.
ca680d1f 405
406If you are still having load order problems, you can make use of the
407C<find_type_constraint> function exported by
408L<Moose::Util::TypeConstraints>:
409
0c551c67 410 class_type('MyApp::User')
411 unless find_type_constraint('MyApp::User') || ;
ca680d1f 412
413This sort of "find or create" logic is simple to write, and will let
414you work around load order issues.
415
ecd7cc3e 416=head1 AUTHOR
417
418Dave Rolsky E<lt>autarch@urth.orgE<gt>
419
420=head1 COPYRIGHT AND LICENSE
421
2840a3b2 422Copyright 2009 by Infinity Interactive, Inc.
ecd7cc3e 423
424L<http://www.iinteractive.com>
425
426This library is free software; you can redistribute it and/or modify
427it under the same terms as Perl itself.
428
429=cut