6 Moose::Cookbook::Snack::Perl5ObjsVsMooseObjs - Short comparison between Perl 5
7 objects and Moose objects
12 use Moose; # automagically sets 'strict' and 'warnings'
14 has 'script_name' => ( is => 'rw', required => 1);
18 # '$0' is the name of this script, set automatically by Perl
19 my $demo = Moose::Demo->new( script_name => $0 );
21 print "My name is " . $demo->script_name . "\n";
22 print "I am a " . $demo->meta->name . " type of object\n";
26 So what's the big stink about Moose? Perl 5 comes with objects and object
27 oriented programming already. Given the above Moose code, what would similar
28 code look like in the existing Perl 5 object-oriented style of programming?
29 Let's take a look and find out...
31 =head2 Perl 5 OO Example
33 # Perl 5 Object, as taught by the 'perltoot' POD page
41 # assign the rest of the method arguments to a temp hash
44 # create the object out of a blessed hash reference
45 my $self = bless ( {}, ref($class) || $class );
46 # create the script_name attribute
47 $self->{script_name} = undef;
49 # verify that the user passed in the 'script_name' attribute
50 if ( exists $args{script_name} ) {
51 $self->script_name($args{script_name});
53 die "ERROR: can't create object without 'script_name' ";
54 } # if ( exists $args{script_name} )
56 # return the object reference back to the caller
62 # check for arguments; use the argument if passed in, otherwise
63 # return the existing value (if any)
64 if (@_) { $self->{script_name} = shift }
65 return $self->{script_name};
72 my $demo = Perl5::Demo->new( script_name => $0 );
74 print "My name is " . $demo->script_name . "\n";
75 print "I am a " . ref($demo) . " type of object\n";
77 Looks more complex, right? Moose does a lot of the labor when working with
78 Perl objects, so that you don't have to. What are some of the specific
79 differences between Moose and Perl 5 Objects?
81 =head3 Difference #1 - declaration of object attributes
83 Both the Moose and Perl 5 objects have one attribute, C<script_name>. It's a
84 good programming practice to always validate user input, so we have the Perl 5
85 object check to make sure that the user passes in the C<script_name> attribute
86 to it when the object is created. The Moose object automatically checks this
87 for us when we set C<required =E<gt> 1> in the C<has> function for the Moose
90 In more advanced Moose usage, you can use something called 'type constraints'
91 when creating your Moose objects. Type constraints are used to validate what
92 the user passes in when setting Moose object attributes. If the user passes
93 in a type of data that Moose is not expecting, then the type constraints in
94 Moose (specifically, the L<Moose::Util::TypeConstraint> module) will let the
95 user know this in no uncertain terms. Type constraints in Moose can be as
96 simple as strings or numbers, or as complex as other Moose objects.
98 =head3 Difference #2 - strict and warning pragmas
100 Moose sets the 'strict' and 'warnings' pragmas for you automatically. We have
101 to do this for ourselves in the Perl 5 example.
103 =head3 Difference #3 - Determining an object's class name
105 The C<ref()> function in Perl 5 is how you determine an object's class name.
106 The proper way to do this with Moose is C<$object-E<gt>meta-E<gt>name>;
108 # an object's class name in Perl 5 OO
109 print "I am a " . ref($demo) . " type of object\n";
111 # an object's class name in Moose
112 print "I am a " . $demo->meta->name . " type of object\n";
114 Moose builds on C<Class::MOP> to provide a rich introspection API that
115 goes way beyond just getting the class name. Check out the
116 C<Class::MOP> documentation for more details.
118 =head3 Difference #4 - Assigning values to Moose object attributes
120 When you wish to assign a value directly to an object attribute for a Perl 5
121 object, you can either create an object method that handles the value for you;
124 sub set_x { # some code here that sets 'x' }
129 or you can assign the value directly to the Perl 5 object attribute like this:
133 Moose creates object methods for handling attributes for you, as long as you
134 specified C<is =E<gt> rw> for each C<has> statement inside the object
135 declaration. This is mentioned in L<Moose::Cookbook::WTF>, in the section
136 labeld B<Accessors>, but briefly:
139 has 'x' => (is => 'rw');
144 The syntax shown for the Perl 5 object (C<$self-E<gt>{x} = 0>) will
145 also work on the Moose object, as Moose objects are, by default,
146 blessed hashes just like the average Perl object is. However, if you
147 access the object's hash reference directly via the latter syntax you
148 will have several problems.
150 First, Moose, will no longer be able to enforce attribute constraints,
151 such as read-only or type constraints. Second, you've broken that
152 object's encapsulation, and encapsulation is one of the reasons you
153 want to use objects in the first place, right?
159 =item L<Moose::Cookbook::Recipe1> - The 'Point' object example
161 =item L<Moose::Util::TypeConstraints> - Type constraints that Moose can use
163 =item L<Moose::Cookbook::WTF> - For when things go wrong with Moose
169 Brian Manning <elspicyjack at gmail dot com>
171 =head1 COPYRIGHT AND LICENSE
173 Copyright (c)2008 by Infinity Interactive, Inc., Brian Manning
175 This documentation is free software; you can redistribute it and/or modify
176 it under the same terms as Perl itself.