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