Mention extensibility of Moose too
[gitmo/Moose.git] / lib / Moose / Intro.pod
CommitLineData
270df362 1=pod
2
3=head1 NAME
4
5Moose::Intro - What is Moose, and how do I use it?
6
7=head1 WHAT IS MOOSE?
8
9Moose is a I<complete> object system for Perl 5. If you've used a
10821858 10modern object-oriented language (which Perl 5 definitely isn't), you
11know they provide keywords for attribute declaration, object
12construction, and inheritance. These keywords are part of the
13language, and you don't care how they are implemented.
270df362 14
15Moose aims to do the same thing for Perl 5 OO. We can't actually
10821858 16create new keywords, but we do offer "sugar" that looks a lot like
17them. More importantly, with Moose, you I<declaritively define> your
18class, without needing to know about blessed hashrefs, accessor
19methods, and so on.
270df362 20
10821858 21Moose lets you focus on the I<logical> structure of your classes, so
22you can focus on "what" rather than "how". With Moose, a class
23definition should read like a list of very concise English sentences.
270df362 24
25Moose is built in top of C<Class::MOP>, a meta-object protocol (aka
26MOP). Using the MOP, Moose provides complete introspection for all
27Moose-using classes. This means you can ask classes about their
28attributes, parents, children, methods, etc., all using a well-defined
10821858 29API. The MOP abstracts away tedious digging about in the Perl symbol
30table, looking at C<@ISA> vars, and all the other crufty Perl tricks
31we know and love (?).
270df362 32
10821858 33Moose is based in large part on the Perl 6 object system, as well as
34drawing on the best ideas from CLOS, Smalltalk, and many other
35languages.
270df362 36
37=head1 WHY MOOSE?
38
10821858 39Moose makes Perl 5 OO both simpler and more powerful. It encapsulates
40all the tricks of Perl 5 power users in high-level declarative APIs
41which are easy to use, and don't require any special knowledge of how
42Perl works under the hood.
270df362 43
44Moose makes Perl 5 OO fun, accessible, and powerful. And if you want
10821858 45to dig about in the guts, Moose lets you do that too, by using and
46extending its powerful introspection API.
270df362 47
48=head1 AN EXAMPLE
49
50 package Person;
51
52 use Moose;
53
54 has 'first_name' => (
55 is => 'rw',
56 isa => 'Str',
57 );
58
59 has 'last_name' => (
60 is => 'rw',
61 isa => 'Str',
62 );
63
64This is a I<complete and usable> class definition!
65
66 package User;
67
68 use DateTime;
69 use Moose;
70
71 extends 'Person';
72
73 has 'password' => (
74 is => 'rw',
f330de33 75 isa => 'Str',
76 );
270df362 77
78 has 'last_login' => (
79 is => 'rw',
80 isa => 'DateTime',
fec9ca3e 81 handles => { 'date_of_last_login' => 'date' },
270df362 82 );
83
84 sub login {
85 my $self = shift;
86 my $pw = shift;
87
88 return 0 if $pw ne $self->password;
89
90 $self->last_login( DateTime->now() );
91
92 return 1;
93 }
94
95We'll leave the line-by-line explanation of this code to other
10821858 96documentation, but you can see how Moose reduces common OO idioms to
97simple declarative constructs.
270df362 98
99=head2 Where's the Constructor?
100
101One point of confusion that might come up with Moose is how it handles
102object construction. B<You should not define a C<new()> method for
103your classes!>
104
105Moose will provide one for you. It will accept a hash or hash
106reference of named parameters matching your attributes. This is just
107another way in which Moose keeps your from worrying I<how> classes are
108implemented. Simply define a class and you're ready to start creating
109objects!
110
10821858 111=head1 MOOSE CONCEPTS (VS "OLD SCHOOL" Perl)
270df362 112
10821858 113In the past, you may not have thought too much about the difference
114between packages and classes, attributes and methods, constructors vs
115methods, etc. Part of what the MOP provides is well-defined
116introspection features for each of those things, and in turn Moose
117provides I<distinct> sugar for each of them. Moose also introduces
118concepts that are uncommon (or entirely new) like roles, method
119modifiers, and declarative delegation.
270df362 120
10821858 121Knowing what these concepts mean in Moose-speak, and how they used to
122be done in old school Perl 5 OO is a good way to start learning to use
123Moose.
270df362 124
125=head2 Class
126
127When you say "use Moose" in a package, you are defining your package
10821858 128as a class. At its simplest, a class will consist simply of attributes
270df362 129and/or methods. It can also include roles, method modifiers, and more.
130
10821858 131A class I<has> zero or more B<attributes>.
270df362 132
133A class I<has> zero or more B<methods>.
134
135A class I<may have> one or more superclasses (aka parent classes). A
136class inherits from its superclass(es).
137
138A class may I<have> B<method modifiers>. These modifiers can apply to
10821858 139its own methods or methods that are inherited from its ancestors.
270df362 140
141A class may I<do> one or more B<roles>.
142
10821858 143A class I<has> a B<constructor> and a B<destructor>. These are
144provided for you "for free" by Moose.
145
146The B<constructor> accepts named parameters corresponding to the
147class's attributes and uses them to initialize an B<object instances>.
270df362 148
149A class I<has> a B<metaclass>, which in turn has B<meta-attributes>,
150B<meta-methods>, and B<meta-roles>. This metaclass I<describes> the
151class.
152
153A class is usually analogous to a category of nouns, like "People" or
154"Users".
155
10821858 156 package Person;
157
158 use Moose;
159 # now it's a Moose class!
160
270df362 161=head2 Attribute
162
163An attribute is a property of the class that defines it. It I<always>
10821858 164has a name, and it I<may have> a number of other defining
165characteristics.
270df362 166
10821858 167These characteristics may include a read/write flag, a B<type>,
168accessor method names, B<delegations>, a default value, and more.
270df362 169
10821858 170Attributes I<are not> methods, but defining them causes various
171accessor methods to be created. At a minimum, a normal attribute will
172always have a reader accessor method. Many attributes have things like
173a writer method, clearer method, and predicate method ("has it been
174set?").
175
176An attribute may also define B<delegation>s, which will create
177additional methods based on the delegation specification.
270df362 178
179By default, Moose stores attributes in the object instance, which is a
10821858 180hashref, I<but this is invisible to the author of a Moose-base class>!
181It is best to think of Moose attributes as "properties" of the
182I<opaque> B<object instance>. These properties are accessed through
183well-defined accessor methods.
270df362 184
185An attribute is usually analagous to specific feature of something in
186the class's category. For example, People have first and last
187names. Users have passwords and last login datetimes.
188
10821858 189 has 'first_name' => (
190 is => 'rw',
191 isa => 'Str',
192 );
193
270df362 194=head2 Method
195
196A method is very straightforward. Any subroutine you define in your
197class is a method.
198
199Methods correspond to verbs, and are what your objects can do. For
200example, a User can login.
201
10821858 202 sub login { ... }
203
270df362 204=head2 Roles
205
206A role is something that a class I<does>. For example, a Machine class
207might do the Breakable role, and a so could a Bone class. A role is
208used to define some concept that cuts across multiple unrelated
10821858 209classes, like "breakability", or "has a color".
270df362 210
211A role I<has> zero or more B<attributes>.
212
213A role I<has> zero or more B<methods>.
214
215A role I<has> zero or more B<method modifiers>.
216
217A role I<has> zero or more B<required methods>.
218
219A required method is not implemented by the role. Instead, a required
220method says "to use this Role you must implement this method".
221
222Roles are I<composed> into classes (or other roles). When a role is
223composed into a class, its attributes and methods are "flattened" into
224the class. Roles I<do not> show up in the inheritance hierarchy. When
225a role is composed, it's attributes and methods appear as if they were
226defined I<in the consuming class>.
227
228Role are somewhat like mixins or interfaces in other OO languages.
229
230 package Breakable;
231
232 use Moose::Role;
233
234 has is_broken => (
235 is => 'rw',
236 isa => 'Bool',
237 );
238
239 requires 'break';
240
241 before 'break' => {
242 my $self = shift;
243
244 $self->is_broken(1);
245 };
246
247=head2 Method Modifiers
248
249A method modifier is a way of defining an action to be taken when a
10821858 250named method is called. Think of it as a hook on the named method. For
251example, you could say "before calling C<login()>, call this modifier
252first". Modifiers come in different flavors like "before", "after",
253"around", and "augment", and you can apply more than one modifier to
254a single method.
270df362 255
256Method modifiers are often used as an alternative to overriding a
257method in a parent class. They are also used in roles as a way of
258modifying methods in the consuming class.
259
260Under the hood, a method modifier is just a plain old Perl subroutine
10821858 261that gets called before or after (or around, etc.) some named method.
270df362 262
263 before 'login' => sub {
264 my $self = shift;
265 my $pw = shift;
266
267 warn "Called login() with $pw\n";
268 };
269
270=head2 Type
271
272Moose also comes with a (miniature) type system. This allows you to
273define types for attributes. Moose has a set of built-in types based
274on what Perl provides, such as "Str", "Num", "Bool", "HashRef", etc.
275
276In addition, every class name in your application can also be used as
277a type name. We saw an example using "DateTime" earlier.
278
279Finally, you can define your own types, either as subtypes or entirely
280new types, with their own constraints. For example, you could define a
10821858 281type "PosInt", a subtype of "Int" which only allows positive numbers.
270df362 282
283=head2 Delegation
284
285Moose attributes provide declarative syntax for defining
286delegations. A delegation is a method which delegates the real work to
287some attribute of the class.
288
10821858 289You saw this in the User example, where we defined a delegation for
fec9ca3e 290the C<date_of_last_login()> method. Under the hood, this simple calls
f1344ac1 291C<date()> on the User object's C<last_login> attribute.
270df362 292
293=head2 Constructor
294
295A constructor creates an B<object instance> for the class. In old
296school Perl, this was usually done by defining a method called
297C<new()> which in turn called C<bless> on a reference.
298
299With Moose, this C<new()> method is created for you, and it simply
300does the right thing. You should never need to define your own
10821858 301constructor!
270df362 302
bc8641fc 303Sometimes you want to do something whenever an object is created. In
304those cases, you can provide a C<BUILD()> method in your class. Moose
305will call this for you after creating a new object.
306
270df362 307=head2 Destructor
308
309This is a special method called when an object instance goes out of
310scope. You can specialize what your class does in this method if you
311need to, but you usually don't.
312
313With old school Perl 5, this is the C<DESTROY()> method, but with
314Moose it is the C<DEMOLISH()> method.
315
316=head2 Object Instance
317
318An object instance is a specific noun in the class's "category". For
319example, one specific Person or User. An instance is created by the
320class's B<constructor>.
321
322An instance has values for its attributes. For example, a specific
323person has a first and last name,
324
325In old school Perl 5, this is often a blessed hash reference. With
326Moose, you should never need to know what your object instance
327actually is. (ok, it's usually a blessed hashref with Moose too)
328
329=head2 Moose VS Old School Summary
330
331=over 4
332
10821858 333=item * Class
270df362 334
335A package with no introspection other than mucking about in the symbol
336table.
337
338With Moose, you get well-defined declaration and introspection.
339
10821858 340=item * Attributes
270df362 341
342Hand-written accessor methods, symbol table hackery, or a helper
343module like C<Class::Accessor>.
344
345With Moose, these are declaritively defined, and distinct from
346methods.
347
10821858 348=item * Method
270df362 349
10821858 350These are pretty much the same in Moose as in old school Perl.
270df362 351
352=item * Roles
353
354C<Class::Trait> or C<Class::Role>, or maybe C<mixin.pm>.
355
356With Moose, they're part of the core feature set, and are
357introspectable like everything else.
358
359=item * Method Modifiers
360
361Could only be done through serious symbol table wizardry, and you
362probably never saw this before (at least in Perl 5).
363
364=item * Type
365
366Hand-written parameter checking in your C<new()> method and accessors.
367
368With Moose, you define types declaratively, and then use them by name
369in your attributes.
370
371=item * Delegation
372
373C<Class::Delegation> or C<Class::Delegator>, but probably even more
374hand-written code.
375
376With Moose, this is also declarative.
377
378=item * Constructor
379
380A C<new()> method which calls C<bless> on a reference.
381
10821858 382Comes for free when you define a class with Moose.
270df362 383
384=item * Destructor
385
386A C<DESTROY()> method.
387
388With Moose, this is called C<DEMOLISH()>.
389
390=item * Object Instance
391
392A blessed reference, usually a hash reference.
393
394With Moose, this is an opaque thing which has a bunch of attributes
395and methods, as defined by its class.
396
e03c5ed2 397=item * Immutabilization
398
399Moose comes with a feature called "immutabilization". When you make
400your class immutable, it means you're done adding methods, attributes,
401roles, etc. This lets Moose optimize your class with a bunch of
402extremely dirty in-place code generation tricks that speed up things
403like object construction and so on.
404
270df362 405=back
406
407=head1 META WHAT?
408
409A metaclass is a class that describes classes. With Moose, every class
10821858 410you define gets a C<meta()> method. It returns a L<Moose::Meta::Class>
411object, which has an introspection API that can tell you about the
412class it represents.
270df362 413
414 my $meta = User->meta();
415
416 for my $attribute ( $meta->compute_all_applicable_attributes ) {
417 print $attribute->name(), "\n";
418
419 if ( $attribute->has_type_constraint ) {
420 print " type: ", $attribute->type_constraint->name, "\n";
421 }
422 }
423
424 for my $method ( $meta->compute_all_applicable_methods ) {
425 print $method->name, "\n";
426 }
427
428Almost every concept we defined earlier has a meta class, so we have
429L<Moose::Meta::Class>, L<Moose::Meta::Attribute>,
430L<Moose::Meta::Method>, L<Moose::Meta::Role>,
431L<Moose::Meta::TypeConstraint>, L<Moose::Meta::Instance>, and so on.
432
433=head1 BUT I NEED TO DO IT MY WAY!
434
435One of the great things about Moose, is that if you dig down and find
436that it does something the "wrong way", you can change it by extending
10821858 437a metaclass. For example, you can have arrayref based objects, you can
438make your constructors strict (no unknown params allowed!), you can
439define a naming scheme for attribute accessors, you can make a class a
440Singleton, and much, much more.
270df362 441
442Many of these extensions require surprisingly small amounts of code,
443and once you've done it once, you'll never have to hand-code "your way
10821858 444of doing things" again. Instead you ll just load your favorite
445extensions.
446
447 package MyWay::User;
448
449 use Moose;
450 use MooseX::StrictConstructor
451 use MooseX::MyWay;
452
453 has ...;
454
270df362 455
456=head1 JUSTIFICATION
457
458If you're still still asking yourself "Why do I need this?", then this
459section is for you.
460
461=over 4
462
463=item Another object system!?!?
464
465Yes, I know there has been an explosion recently of new ways to
466build objects in Perl 5, most of them based on inside-out objects
467and other such things. Moose is different because it is not a new
468object system for Perl 5, but instead an extension of the existing
469object system.
470
471Moose is built on top of L<Class::MOP>, which is a metaclass system
472for Perl 5. This means that Moose not only makes building normal
473Perl 5 objects better, but it also provides the power of metaclass
474programming.
475
476=item Is this for real? Or is this just an experiment?
477
478Moose is I<based> on the prototypes and experiments Stevan did for the
479Perl 6 meta-model. However, Moose is B<NOT> an experiment or
480prototype; it is for B<real>.
481
482=item Is this ready for use in production?
483
484Yes.
485
10821858 486Moose has been used successfully in production environments by several
270df362 487people and companies. There are Moose applications which have been in
488production with little or no issue now for well over two years. We
489consider it highly stable and we are commited to keeping it stable.
490
491Of course, in the end, you need to make this call yourself. If you
492have any questions or concerns, please feel free to email Stevan, the
493moose@perl.org list, or just stop by irc.perl.org#moose and ask away.
494
495=item Is Moose just Perl 6 in Perl 5?
496
497No. While Moose is very much inspired by Perl 6, it is not itself Perl
4986. Instead, it is an OO system for Perl 5. Stevan built Moose because
499he was tired of writing the same old boring Perl 5 OO code, and
500drooling over Perl 6 OO. So instead of switching to Ruby, he wrote
501Moose :)
502
503=item Wait, I<post> modern, I thought it was just I<modern>?
504
505Stevan read Larry Wall's talk from the 1999 Linux World entitled
506"Perl, the first postmodern computer language" in which he talks about
507how he picked the features for Perl because he thought they were cool
508and he threw out the ones that he thought sucked. This got him
509thinking about how we have done the same thing in Moose. For Moose, we
510have "borrowed" features from Perl 6, CLOS (LISP), Smalltalk, Java,
511BETA, OCaml, Ruby and more, and the bits we didn't like (cause they
512sucked) we tossed aside. So for this reason (and a few others) Stevan
513has re-dubbed Moose a I<postmodern> object system.
514
515Nuff Said.
516
517=back
518
e03c5ed2 519=head1 WHAT NEXT?
520
521So you're sold on Moose. Time to learn how to really use it.
522
523We recommend that you start with the L<Moose::Cookbook>. If you work
524your way through all the recipes under the basics section, you should
525have a pretty good sense of how Moose works, and all of its basic OO
526features.
527
528After that, check out the Role recipes. If you're really curious, go
529on and read the Meta and Extending recipes, but those are mostly there
530for people who want to be Moose wizards and change how Moose works.
531
f330de33 532If you want to see how Moose would translate directly old school Perl
5335 OO code, check out the L<Moose::Unsweetened>.
534
270df362 535=head1 AUTHOR
536
10821858 537Dave Rolsky E<lt>autarch@urth.orgE<gt> and Stevan Little
270df362 538E<lt>stevan@iinteractive.comE<gt>
539
540=head1 COPYRIGHT AND LICENSE
541
542Copyright 2008 by Infinity Interactive, Inc.
543
544L<http://www.iinteractive.com>
545
546This library is free software; you can redistribute it and/or modify
547it under the same terms as Perl itself.
548
549=cut