This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix some typos in perlsyn.pod
[perl5.git] / pod / perlootut.pod
CommitLineData
dbfe2941
DR
1=encoding utf8
2
3=for comment
4Consistent formatting of this file is achieved with:
5 perl ./Porting/podtidy pod/perlootut.pod
6
7=head1 NAME
8
9perlootut - Object-Oriented Programming in Perl Tutorial
10
11=head1 DATE
12
13This document was created in February, 2011.
14
15=head1 DESCRIPTION
16
17This document provides an introduction to object-oriented programming
18in Perl. It begins with a brief overview of the concepts behind object
19oriented design. Then it introduces several different OO systems from
20L<CPAN|http://search.cpan.org> which build on top of what Perl
21provides.
22
23By default, Perl's built-in OO system is very minimal, leaving you to
24do most of the work. This minimalism made a lot of sense in 1994, but
25in the years since Perl 5.0 we've seen a number of common patterns
26emerge in Perl OO. Fortunately, Perl's flexibility has allowed a rich
27ecosystem of Perl OO systems to flourish.
28
29If you want to know how Perl OO works under the hood, the L<perlobj>
30document explains the nitty gritty details.
31
32This document assumes that you already understand the basics of Perl
33syntax, variable types, operators, and subroutine calls. If you don't
34understand these concepts yet, please read L<perlintro> first. You
35should also read the L<perlsyn>, L<perlop>, and L<perlsub> documents.
36
37=head1 OBJECT-ORIENTED FUNDAMENTALS
38
39Most object systems share a number of common concepts. You've probably
40heard terms like "class", "object, "method", and "attribute" before.
41Understanding the concepts will make it much easier to read and write
42object-oriented code. If you're already familiar with these terms, you
43should still skim this section, since it explains each concept in terms
44of Perl's OO implementation.
45
46Perl's OO system is class-based. Class-based OO is fairly common. It's
47used by Java, C++, C#, Python, Ruby, and many other languages. There
48are other object orientation paradigms as well. JavaScript is the most
49popular language to use another paradigm. JavaScript's OO system is
50prototype-based.
51
52=head2 Object
53
54An B<object> is a data structure that bundles together data and
55subroutines which operate on that data. An object's data is called
56B<attributes>, and its subroutines are called B<methods>. An object can
57be thought of as a noun (a person, a web service, a computer).
58
d49ecf98 59An object represents a single discrete thing. For example, an object
37fc2a72
DR
60might represent a file. The attributes for a file object might include
61its path, content, and last modification time. If we created an object
62to represent F</etc/hostname> on a machine named "foo.example.com",
63that object's path would be "/etc/hostname", its content would be
64"foo\n", and it's last modification time would be 1304974868 seconds
65since the beginning of the epoch.
dbfe2941 66
37fc2a72
DR
67The methods associated with a file might include C<rename()> and
68C<write()>.
dbfe2941 69
235f4381
DC
70In Perl most objects are hashes, but the OO systems we recommend keep
71you from having to worry about this. In practice, it's best to consider
72an object's internal data structure opaque.
dbfe2941
DR
73
74=head2 Class
75
76A B<class> defines the behavior of a category of objects. A class is a
37fc2a72 77name for a category (like "File"), and a class also defines the
dbfe2941
DR
78behavior of objects in that category.
79
37fc2a72
DR
80All objects belong to a specific class. For example, our
81F</etc/hostname> object belongs to the C<File> class. When we want to
82create a specific object, we start with its class, and B<construct> or
dbfe2941
DR
83B<instantiate> an object. A specific object is often referred to as an
84B<instance> of a class.
85
86In Perl, any package can be a class. The difference between a package
87which is a class and one which isn't is based on how the package is
37fc2a72 88used. Here's our "class declaration" for the C<File> class:
dbfe2941 89
37fc2a72 90 package File;
dbfe2941
DR
91
92In Perl, there is no special keyword for constructing an object.
93However, most OO modules on CPAN use a method named C<new()> to
94construct a new object:
95
37fc2a72
DR
96 my $hostname = File->new(
97 path => '/etc/hostname',
98 content => "foo\n",
99 last_mod_time => 1304974868,
dbfe2941
DR
100 );
101
102(Don't worry about that C<< -> >> operator, it will be explained
103later.)
104
105=head3 Blessing
106
235f4381
DC
107As we said earlier, most Perl objects are hashes, but an object can be
108an instance of any Perl data type (scalar, array, etc.). Turning a
109plain data structure into an object is done by B<blessing> that data
110structure using Perl's C<bless> function.
dbfe2941
DR
111
112While we strongly suggest you don't build your objects from scratch,
235f4381
DC
113you should know the term B<bless>. A B<blessed> data structure (aka "a
114referent") is an object. We sometimes say that an object has been
115"blessed into a class".
dbfe2941 116
235f4381 117Once a referent has been blessed, the C<blessed> function from the
dbfe2941
DR
118L<Scalar::Util> core module can tell us its class name. This subroutine
119returns an object's class when passed an object, and false otherwise.
120
121 use Scalar::Util 'blessed';
122
37fc2a72
DR
123 print blessed($hash); # undef
124 print blessed($hostname); # File
dbfe2941
DR
125
126=head3 Constructor
127
128A B<constructor> creates a new object. In Perl, a class's constructor
129is just another method, unlike some other languages, which provide
130syntax for constructors. Most Perl classes use C<new> as the name for
131their constructor:
132
37fc2a72 133 my $file = File->new(...);
dbfe2941
DR
134
135=head2 Methods
136
137You already learned that a B<method> is a subroutine that operates on
610e352c 138an object. You can think of a method as the things that an object can
4c054e89
DR
139I<do>. If an object is a noun, then methods are its verbs (save, print,
140open).
dbfe2941
DR
141
142In Perl, methods are simply subroutines that live in a class's package.
143Methods are always written to receive the object as their first
144argument:
145
37fc2a72 146 sub print_info {
dbfe2941
DR
147 my $self = shift;
148
37fc2a72 149 print "This file is at ", $self->path, "\n";
dbfe2941
DR
150 }
151
a6d49569 152 $file->print_info;
37fc2a72 153 # The file is at /etc/hostname
dbfe2941
DR
154
155What makes a method special is I<how it's called>. The arrow operator
156(C<< -> >>) tells Perl that we are calling a method.
157
158When we make a method call, Perl arranges for the method's B<invocant>
159to be passed as the first argument. B<Invocant> is a fancy name for the
160thing on the left side of the arrow. The invocant can either be a class
161name or an object. We can also pass additional arguments to the method:
162
37fc2a72
DR
163 sub print_info {
164 my $self = shift;
165 my $prefix = shift // "This file is at ";
dbfe2941 166
37fc2a72 167 print $prefix, ", ", $self->path, "\n";
dbfe2941
DR
168 }
169
a6d49569 170 $file->print_info("The file is located at ");
37fc2a72 171 # The file is located at /etc/hostname
dbfe2941
DR
172
173=head2 Attributes
174
175Each class can define its B<attributes>. When we instantiate an object,
37fc2a72
DR
176we assign values to those attributes. For example, every C<File> object
177has a path. Attributes are sometimes called B<properties>.
dbfe2941
DR
178
179Perl has no special syntax for attributes. Under the hood, attributes
235f4381 180are often stored as keys in the object's underlying hash, but don't
dbfe2941
DR
181worry about this.
182
183We recommend that you only access attributes via B<accessor> methods.
184These are methods that can get or set the value of each attribute. We
37fc2a72
DR
185saw this earlier in the C<print_info()> example, which calls C<<
186$self->path >>.
dbfe2941
DR
187
188You might also see the terms B<getter> and B<setter>. These are two
189types of accessors. A getter gets the attribute's value, while a setter
3282575c 190sets it. Another term for a setter is B<mutator>
dbfe2941
DR
191
192Attributes are typically defined as read-only or read-write. Read-only
193attributes can only be set when the object is first created, while
194read-write attributes can be altered at any time.
195
196The value of an attribute may itself be another object. For example,
37fc2a72
DR
197instead of returning its last mod time as a number, the C<File> class
198could return a L<DateTime> object representing that value.
dbfe2941
DR
199
200It's possible to have a class that does not expose any publicly
201settable attributes. Not every class has attributes and methods.
202
203=head2 Polymorphism
204
205B<Polymorphism> is a fancy way of saying that objects from two
37fc2a72
DR
206different classes share an API. For example, we could have C<File> and
207C<WebPage> classes which both have a C<print_content()> method. This
610e352c
DR
208method might produce different output for each class, but they share a
209common interface.
dbfe2941
DR
210
211While the two classes may differ in many ways, when it comes to the
37fc2a72
DR
212C<print_content()> method, they are the same. This means that we can
213try to call the C<print_content()> method on an object of either class,
214and B<we don't have to know what class the object belongs to!>
dbfe2941
DR
215
216Polymorphism is one of the key concepts of object-oriented design.
217
218=head2 Inheritance
219
610e352c
DR
220B<Inheritance> lets you create a specialized version of an existing
221class. Inheritance lets the new class to reuse the methods and
222attributes of another class.
dbfe2941 223
37fc2a72
DR
224For example, we could create an C<File::MP3> class which B<inherits>
225from C<File>. An C<File::MP3> B<is-a> I<more specific> type of C<File>.
226All mp3 files are files, but not all files are mp3 files.
dbfe2941 227
610e352c
DR
228We often refer to inheritance relationships as B<parent-child> or
229C<superclass/subclass> relationships. Sometimes we say that the child
230has an B<is-a> relationship with its parent class.
231
37fc2a72
DR
232C<File> is a B<superclass> of C<File::MP3>, and C<File::MP3> is a
233B<subclass> of C<File>.
dbfe2941 234
37fc2a72 235 package File::MP3;
dbfe2941 236
37fc2a72 237 use parent 'File';
dbfe2941
DR
238
239The L<parent> module is one of several ways that Perl lets you define
240inheritance relationships.
241
242Perl allows multiple inheritance, which means that a class can inherit
243from multiple parents. While this is possible, we strongly recommend
244against it. Generally, you can use B<roles> to do everything you can do
610e352c 245with multiple inheritance, but in a cleaner way.
dbfe2941
DR
246
247Note that there's nothing wrong with defining multiple subclasses of a
248given class. This is both common and safe. For example, we might define
37fc2a72
DR
249C<File::MP3::FixedBitrate> and C<File::MP3::VariableBitrate> classes to
250distinguish between different types of mp3 file.
dbfe2941
DR
251
252=head3 Overriding methods and method resolution
253
254Inheritance allows two classes to share code. By default, every method
255in the parent class is also available in the child. The child can
256explicitly B<override> a parent's method to provide its own
37fc2a72
DR
257implementation. For example, if we have an C<File::MP3> object, it has
258the C<print_info()> method from C<File>:
259
260 my $cage = File::MP3->new(
261 path => 'mp3s/My-Body-Is-a-Cage.mp3',
262 content => $mp3_data,
263 last_mod_time => 1304974868,
264 title => 'My Body Is a Cage',
dbfe2941
DR
265 );
266
37fc2a72
DR
267 $cage->print_info;
268 # The file is at mp3s/My-Body-Is-a-Cage.mp3
dbfe2941 269
37fc2a72
DR
270If we wanted to include the mp3's title in the greeting, we could
271override the method:
dbfe2941 272
37fc2a72 273 package File::MP3;
dbfe2941 274
37fc2a72 275 use parent 'File';
dbfe2941 276
37fc2a72 277 sub print_info {
dbfe2941
DR
278 my $self = shift;
279
37fc2a72
DR
280 print "This file is at ", $self->path, "\n";
281 print "Its title is ", $self->title, "\n";
dbfe2941
DR
282 }
283
37fc2a72
DR
284 $cage->print_info;
285 # The file is at mp3s/My-Body-Is-a-Cage.mp3
286 # Its title is My Body Is a Cage
dbfe2941
DR
287
288The process of determining what method should be used is called
289B<method resolution>. What Perl does is look at the object's class
37fc2a72 290first (C<File::MP3> in this case). If that class defines the method,
dbfe2941 291then that class's version of the method is called. If not, Perl looks
37fc2a72
DR
292at each parent class in turn. For C<File::MP3>, its only parent is
293C<File>. If C<File::MP3> does not define the method, but C<File> does,
294then Perl calls the method in C<File>.
dbfe2941 295
37fc2a72 296If C<File> inherited from C<DataSource>, which inherited from C<Thing>,
dbfe2941
DR
297then Perl would keep looking "up the chain" if necessary.
298
299It is possible to explicitly call a parent method from a child:
300
37fc2a72 301 package File::MP3;
dbfe2941 302
37fc2a72 303 use parent 'File';
dbfe2941 304
37fc2a72 305 sub print_info {
dbfe2941
DR
306 my $self = shift;
307
37fc2a72
DR
308 $self->SUPER::print_info();
309 print "Its title is ", $self->title, "\n";
dbfe2941
DR
310 }
311
37fc2a72
DR
312The C<SUPER::> bit tells Perl to look for the C<print_info()> in the
313C<File::MP3> class's inheritance chain. When it finds the parent class
314that implements this method, the method is called.
dbfe2941
DR
315
316We mentioned multiple inheritance earlier. The main problem with
317multiple inheritance is that it greatly complicates method resolution.
318See L<perlobj> for more details.
319
320=head2 Encapsulation
321
322B<Encapsulation> is the idea that an object is opaque. When another
323developer uses your class, they don't need to know I<how> it is
324implemented, they just need to know I<what> it does.
325
326Encapsulation is important for several reasons. First, it allows you to
327separate the public API from the private implementation. This means you
328can change that implementation without breaking the API.
329
330Second, when classes are well encapsulated, they become easier to
331subclass. Ideally, a subclass uses the same APIs to access object data
332that its parent class uses. In reality, subclassing sometimes involves
333violating encapsulation, but a good API can minimize the need to do
334this.
335
235f4381
DC
336We mentioned earlier that most Perl objects are implemented as hashes
337under the hood. The principle of encapsulation tells us that we should
338not rely on this. Instead, we should use accessor methods to access the
339data in that hash. The object systems that we recommend below all
340automate the generation of accessor methods. If you use one of them,
341you should never have to access the object as a hash directly.
dbfe2941
DR
342
343=head2 Composition
344
345In object-oriented code, we often find that one object references
346another object. This is called B<composition>, or a B<has-a>
347relationship.
348
37fc2a72
DR
349Earlier, we mentioned that the C<File> class's C<last_mod_time>
350accessor could return a L<DateTime> object. This is a perfect example
351of composition. We could go even further, and make the C<path> and
352C<content> accessors return objects as well. The C<File> class would
d49ecf98 353then be B<composed> of several other objects.
dbfe2941
DR
354
355=head2 Roles
356
357B<Roles> are something that a class I<does>, rather than something that
358it I<is>. Roles are relatively new to Perl, but have become rather
359popular. Roles are B<applied> to classes. Sometimes we say that classes
360B<consume> roles.
361
362Roles are an alternative to inheritance for providing polymorphism.
363Let's assume we have two classes, C<Radio> and C<Computer>. Both of
364these things have on/off switches. We want to model that in our class
365definitions.
366
367We could have both classes inherit from a common parent, like
368C<Machine>, but not all machines have on/off switches. We could create
369a parent class called C<HasOnOffSwitch>, but that is very artificial.
370Radios and computers are not specializations of this parent. This
371parent is really a rather ridiculous creation.
372
373This is where roles come in. It makes a lot of sense to create a
374C<HasOnOffSwitch> role and apply it to both classes. This role would
375define a known API like providing C<turn_on()> and C<turn_off()>
376methods.
377
378Perl does not have any built-in way to express roles. In the past,
379people just bit the bullet and used multiple inheritance. Nowadays,
380there are several good choices on CPAN for using roles.
381
ce843b44
DR
382=head2 When to Use OO
383
384Object Orientation is not the best solution to every problem. In I<Perl
385Best Practices> (copyright 2004, Published by O'Reilly Media, Inc.),
386Damian Conway provides a list of criteria to use when deciding if OO is
387the right fit for your problem:
388
389=over 4
390
995ab4ef 391=item *
ce843b44
DR
392
393The system being designed is large, or is likely to become large.
394
995ab4ef 395=item *
ce843b44
DR
396
397The data can be aggregated into obvious structures, especially if
398there's a large amount of data in each aggregate.
399
995ab4ef 400=item *
ce843b44
DR
401
402The various types of data aggregate form a natural hierarchy that
403facilitates the use of inheritance and polymorphism.
404
995ab4ef 405=item *
ce843b44
DR
406
407You have a piece of data on which many different operations are
408applied.
409
995ab4ef 410=item *
ce843b44
DR
411
412You need to perform the same general operations on related types of
413data, but with slight variations depending on the specific type of data
414the operations are applied to.
415
995ab4ef 416=item *
ce843b44
DR
417
418It's likely you'll have to add new data types later.
419
995ab4ef 420=item *
ce843b44
DR
421
422The typical interactions between pieces of data are best represented by
423operators.
424
995ab4ef 425=item *
ce843b44
DR
426
427The implementation of individual components of the system is likely to
428change over time.
429
995ab4ef 430=item *
ce843b44
DR
431
432The system design is already object-oriented.
433
995ab4ef 434=item *
ce843b44
DR
435
436Large numbers of other programmers will be using your code modules.
437
438=back
439
dbfe2941
DR
440=head1 PERL OO SYSTEMS
441
442As we mentioned before, Perl's built-in OO system is very minimal, but
443also quite flexible. Over the years, many people have developed systems
444which build on top of Perl's built-in system to provide more features
445and convenience.
446
447We strongly recommend that you use one of these systems. Even the most
448minimal of them eliminates a lot of repetitive boilerplate. There's
449really no good reason to write your classes from scratch in Perl.
450
451If you are interested in the guts underlying these systems, check out
452L<perlobj>.
453
454=head2 Moose
455
456L<Moose> bills itself as a "postmodern object system for Perl 5". Don't
457be scared, the "postmodern" label is a callback to Larry's description
458of Perl as "the first postmodern computer language".
459
460C<Moose> provides a complete, modern OO system. Its biggest influence
461is the Common Lisp Object System, but it also borrows ideas from
462Smalltalk and several other languages. C<Moose> was created by Stevan
463Little, and draws heavily from his work on the Perl 6 OO design.
464
37fc2a72
DR
465Here is our C<File> class using C<Moose>:
466
37fc2a72
DR
467 package File;
468 use Moose;
469
470 has path => ( is => 'ro' );
471 has content => ( is => 'ro' );
472 has last_mod_time => ( is => 'ro' );
473
474 sub print_info {
475 my $self = shift;
476
477 print "This file is at ", $self->path, "\n";
478 }
479
dbfe2941
DR
480C<Moose> provides a number of features:
481
482=over 4
483
484=item * Declarative sugar
485
486C<Moose> provides a layer of declarative "sugar" for defining classes.
487That sugar is just a set of exported functions that make declaring how
488your class works simpler and more palatable. This lets you describe
489I<what> your class is, rather than having to tell Perl I<how> to
490implement your class.
491
dbfe2941
DR
492The C<has()> subroutine declares an attribute, and C<Moose>
493automatically creates accessors for these attributes. It also takes
494care of creating a C<new()> method for you. This constructor knows
495about the attributes you declared, so you can set them when creating a
37fc2a72 496new C<File>.
dbfe2941
DR
497
498=item * Roles built-in
499
500C<Moose> lets you define roles the same way you define classes:
501
502 package HasOnOfSwitch;
503 use Moose::Role;
504
505 has is_on => (
506 is => 'rw',
507 isa => 'Bool',
508 );
509
510 sub turn_on {
511 my $self = shift;
512 $self->is_on(1);
513 }
514
515 sub turn_off {
516 my $self = shift;
517 $self->is_on(0);
518 }
519
520=item * A miniature type system
521
522In the example above, you can see that we passed C<< isa => 'Bool' >>
523to C<has()> when creating our C<is_on> attribute. This tells C<Moose>
524that this attribute must be a boolean value. If we try to set it to an
525invalid value, our code will throw an error.
526
527=item * Full introspection and manipulation
528
529Perl's built-in introspection features are fairly minimal. C<Moose>
530builds on top of them and creates a full introspection layer for your
37fc2a72 531classes. This lets you ask questions like "what methods does the File
dbfe2941
DR
532class implement?" It also lets you modify your classes
533programmatically.
534
535=item * Self-hosted and extensible
536
537C<Moose> describes itself using its own introspection API. Besides
538being a cool trick, this means that you can extend C<Moose> using
539C<Moose> itself.
540
541=item * Rich ecosystem
542
543There is a rich ecosystem of C<Moose> extensions on CPAN under the
544L<MooseX|http://search.cpan.org/search?query=MooseX&mode=dist>
545namespace. In addition, many modules on CPAN already use C<Moose>,
546providing you with lots of examples to learn from.
547
548=item * Many more features
549
550C<Moose> is a very powerful tool, and we can't cover all of its
551features here. We encourage you to learn more by reading the C<Moose>
552documentation, starting with
553L<Moose::Manual|http://search.cpan.org/perldoc?Moose::Manual>.
554
555=back
556
557Of course, C<Moose> isn't perfect.
558
559C<Moose> can make your code slower to load. C<Moose> itself is not
560small, and it does a I<lot> of code generation when you define your
561class. This code generation means that your runtime code is as fast as
562it can be, but you pay for this when your modules are first loaded.
563
564This load time hit can be a problem when startup speed is important,
565such as with a command-line script or a "plain vanilla" CGI script that
566must be loaded each time it is executed.
567
568Before you panic, know that many people do use C<Moose> for
569command-line tools and other startup-sensitive code. We encourage you
570to try C<Moose> out first before worrying about startup speed.
571
572C<Moose> also has several dependencies on other modules. Most of these
573are small stand-alone modules, a number of which have been spun off
574from C<Moose>. C<Moose> itself, and some of its dependencies, require a
575compiler. If you need to install your software on a system without a
576compiler, or if having I<any> dependencies is a problem, then C<Moose>
577may not be right for you.
578
579=head3 Mouse
580
581If you try C<Moose> and find that one of these issues is preventing you
582from using C<Moose>, we encourage you to consider L<Mouse> next.
583C<Mouse> implements a subset of C<Moose>'s functionality in a simpler
584package. For all features that it does implement, the end-user API is
585I<identical> to C<Moose>, meaning you can switch from C<Mouse> to
586C<Moose> quite easily.
587
588C<Mouse> does not implement most of C<Moose>'s introspection API, so
610e352c
DR
589it's often faster when loading your modules. Additionally, all of its
590I<required> dependencies ship with the Perl core, and it can run
591without a compiler. If you do have a compiler, C<Mouse> will use it to
592compile some of its code for a speed boost.
dbfe2941 593
610e352c 594Finally, it ships with a C<Mouse::Tiny> module that takes most of
dbfe2941
DR
595C<Mouse>'s features and bundles them up in a single module file. You
596can copy this module file into your application's library directory for
597easy bundling.
598
599The C<Moose> authors hope that one day C<Mouse> can be made obsolete by
600improving C<Moose> enough, but for now it provides a worthwhile
601alternative to C<Moose>.
602
603=head2 Class::Accessor
604
605L<Class::Accessor> is the polar opposite of C<Moose>. It provides very
606few features, nor is it self-hosting.
607
608It is, however, very simple, pure Perl, and it has no non-core
609dependencies. It also provides a "Moose-like" API on demand for the
610features it supports.
611
612Even though it doesn't do much, it is still preferable to writing your
613own classes from scratch.
614
37fc2a72 615Here's our C<File> class with C<Class::Accessor>:
dbfe2941 616
37fc2a72 617 package File;
dbfe2941
DR
618 use Class::Accessor 'antlers';
619
37fc2a72
DR
620 has path => ( is => 'ro' );
621 has content => ( is => 'ro' );
622 has last_mod_time => ( is => 'ro' );
dbfe2941 623
37fc2a72 624 sub print_info {
dbfe2941
DR
625 my $self = shift;
626
37fc2a72 627 print "This file is at ", $self->path, "\n";
dbfe2941
DR
628 }
629
630The C<antlers> import flag tells C<Class::Accessor> that you want to
631define your attributes using C<Moose>-like syntax. The only parameter
632that you can pass to C<has> is C<is>. We recommend that you use this
633Moose-like syntax if you choose C<Class::Accessor> since it means you
634will have a smoother upgrade path if you later decide to move to
635C<Moose>.
636
637Like C<Moose>, C<Class::Accessor> generates accessor methods and a
638constructor for your class.
639
640=head2 Object::Tiny
641
642Finally, we have L<Object::Tiny>. This module truly lives up to its
643name. It has an incredibly minimal API and absolutely no dependencies
644(core or not). Still, we think it's a lot easier to use than writing
645your own OO code from scratch.
646
37fc2a72 647Here's our C<File> class once more:
dbfe2941 648
37fc2a72
DR
649 package File;
650 use Object::Tiny qw( path content last_mod_time );
dbfe2941 651
37fc2a72 652 sub print_info {
dbfe2941
DR
653 my $self = shift;
654
37fc2a72 655 print "This file is at ", $self->path, "\n";
dbfe2941
DR
656 }
657
658That's it!
659
660With C<Object::Tiny>, all accessors are read-only. It generates a
661constructor for you, as well as the accessors you define.
662
663=head2 Role::Tiny
664
665As we mentioned before, roles provide an alternative to inheritance,
666but Perl does not have any built-in role support. If you choose to use
667Moose, it comes with a full-fledged role implementation. However, if
668you use one of our other recommended OO modules, you can still use
669roles with L<Role::Tiny>
670
671C<Role::Tiny> provides some of the same features as Moose's role
672system, but in a much smaller package. Most notably, it doesn't support
673any sort of attribute declaration, so you have to do that by hand.
674Still, it's useful, and works well with C<Class::Accessor> and
675C<Object::Tiny>
676
677=head2 OO System Summary
678
679Here's a brief recap of the options we covered:
680
681=over 4
682
683=item * L<Moose>
684
685C<Moose> is the maximal option. It has a lot of features, a big
686ecosystem, and a thriving user base. We also covered L<Mouse> briefly.
687C<Mouse> is C<Moose> lite, and a reasonable alternative when Moose
688doesn't work for your application.
689
690=item * L<Class::Accessor>
691
692C<Class::Accessor> does a lot less than C<Moose>, and is a nice
693alternative if you find C<Moose> overwhelming. It's been around a long
694time and is well battle-tested. It also has a minimal C<Moose>
695compatibility mode which makes moving from C<Class::Accessor> to
696C<Moose> easy.
697
698=item * L<Object::Tiny>
699
700C<Object::Tiny> is the absolute minimal option. It has no dependencies,
701and almost no syntax to learn. It's a good option for a super minimal
702environment and for throwing something together quickly without having
703to worry about details.
704
705=item * L<Role::Tiny>
706
707Use C<Role::Tiny> with C<Class::Accessor> or C<Object::Tiny> if you
708find yourself considering multiple inheritance. If you go with
709C<Moose>, it comes with its own role implementation.
710
711=back
712
713=head2 Other OO Systems
714
715There are literally dozens of other OO-related modules on CPAN besides
716those covered here, and you're likely to run across one or more of them
717if you work with other people's code.
718
719In addition, plenty of code in the wild does all of its OO "by hand",
720using just the Perl built-in OO features. If you need to maintain such
721code, you should read L<perlobj> to understand exactly how Perl's
722built-in OO works.
723
724=head1 CONCLUSION
725
4017f822
DR
726As we said before, Perl's minimal OO system has led to a profusion of
727OO systems on CPAN. While you can still drop down to the bare metal and
966af81c
DR
728write your classes by hand, there's really no reason to do that with
729modern Perl.
dbfe2941
DR
730
731For small systems, L<Object::Tiny> and L<Class::Accessor> both provide
732minimal object systems that take care of basic boilerplate for you.
733
734For bigger projects, L<Moose> provides a rich set of features that will
735let you focus on implementing your business logic.
736
737We encourage you to play with and evaluate L<Moose>,
738L<Class::Accessor>, and L<Object::Tiny> to see which OO system is right
739for you.
740
741=cut