object-oriented programming with perl and moose
TRANSCRIPT
![Page 2: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/2.jpg)
6th April 2013
Perl School Low cost Perl training Training at all levels Trying to build a buzz about Perl Perl is not dead Perl is Modern
![Page 3: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/3.jpg)
6th April 2013
Xkcd Says
![Page 4: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/4.jpg)
6th April 2013
Your Help Please Trying to build a buzz about Perl You can help Please tell your friends Blog Twitter Facebook http://perlschool.co.uk
![Page 5: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/5.jpg)
6th April 2013
Upcoming Courses
Perl School 6: Database Programming with Perl and DBIx::Class
− 8th June 2013
http://perlschool.co.uk/upcoming/
![Page 6: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/6.jpg)
6th April 2013
Timings 10:00 Session 1 11:15 Break 11:30 Session 2 13:00 Lunch 14:00 Session 3 15:30 Break 15:45 Session 4 17:00 End
![Page 7: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/7.jpg)
6th April 2013
Admin Stuff
Tickets Facilities Lunch Slides Feedback
![Page 8: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/8.jpg)
6th April 2013 8
What We Will Cover
Introduction to Object Oriented programming
Overview of Moose Object Attributes Subclasses Object construction
![Page 9: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/9.jpg)
6th April 2013 9
What We Will Cover
Data types Delegation Roles Meta-programming Alternatives to Moose Further information
![Page 10: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/10.jpg)
Object Oriented Programming
![Page 11: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/11.jpg)
6th April 2013 11
What is OOP?
“Traditional” programming is procedural Subroutines work on variables my $twelve = regenerate($eleven);
Variables are dumb Just stores for data
![Page 12: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/12.jpg)
6th April 2013 12
What is OOP? Object Oriented programming inverts this Variables are objects Objects can carry out certain processes
− Called methods my $twelve = $eleven->regenerate();
Objects are intelligent Objects know what methods they can carry
out
![Page 13: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/13.jpg)
6th April 2013 13
Some Concepts A Class is a type of intelligent variable
− e.g. Time Lord
An Object is an instance of a class
− e.g. The Doctor
A Method is an action that an object does− e.g. Regenerate
An Attribute is a piece of data in an object− e.g. Name
![Page 14: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/14.jpg)
6th April 2013 14
Some Concepts
A class contains a number of methods An object is of a particular class The class defines the behaviour of an object An object has many attributes
− Data items
A class can also have attributes− Class-wide data items
![Page 15: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/15.jpg)
6th April 2013 15
Methods
Methods can be either class methods or object methods
Class methods are called on a class
− my $doctor = TimeLord->new;
Object methods are called on an object
− $doctor->regenerate;
![Page 16: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/16.jpg)
6th April 2013 16
Constructors
All classes need a constructor method Creates a new object of that class Usually a class method Often called new my $doctor = TimeLord->new;
![Page 17: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/17.jpg)
6th April 2013 17
Constructors
A Class might have multiple constructors my $doctor = TimeLord->new;
my $flesh_dr = TimeLord->clone($doctor);
A constructor might be an object method my $flesh_dr = $doctor->clone;
![Page 18: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/18.jpg)
6th April 2013 18
Accessors & Mutators
Access object attributes with an accessor method
say “The time lord's name is “, $doctor->get_name;
Change an attribute with a mutator method $doctor->set_age( $doctor->get_age + 1);
![Page 19: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/19.jpg)
6th April 2013 19
Accessor/Mutators
Accessors and mutators are often the same method
say “The time lord's name is “, $doctor->name;
$doctor->age($doctor->age + 1);
Checks number of parameters Reacts appropriately
![Page 20: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/20.jpg)
6th April 2013 20
Accessor/Mutators
Which to choose? Perl Best Practices says get_foo/set_foo I like one method called foo No firm rules Pick one Stick with it
![Page 21: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/21.jpg)
6th April 2013 21
Subclasses
A subclass is a specialisation of a class “Alien” is a class “Dalek” is one possible subclass Avoid reimplementing shared methods
![Page 22: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/22.jpg)
6th April 2013 22
Subclasses
Subclasses alter behaviour of their parent classes
Add methods Override existing methods Add attributes Override existing attributes
![Page 23: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/23.jpg)
Object Oriented Perl
![Page 24: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/24.jpg)
6th April 2013 24
OO Perl
Three rules of OO Perl A class is a package An object is reference A method is a subroutine
![Page 25: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/25.jpg)
6th April 2013 25
A Class is a Package
Same as any other package Contains subroutines
− Methods
Contains variables− Class attributes
![Page 26: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/26.jpg)
6th April 2013 26
An Object is a Reference
Usually a reference to a hash Hash keys are attribute names Hash values are attribute values Actually a “blessed” hash
− So it knows what class it is
![Page 27: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/27.jpg)
6th April 2013 27
A Method is a Subroutine
Just like any other subroutine Some rules on parameters First parameter is class name or object
reference Some differences in calling Arrow notation
− $doctor->name()
![Page 28: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/28.jpg)
6th April 2013 28
Calling Methods
Methods are called using arrow notation Class methods
− TimeLord->new();
Object methods
− $doctor->regenerate();
![Page 29: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/29.jpg)
6th April 2013 29
Calling Methods
Perl rewrites the method call Invocant passed as first argument TimeLord->new();
TimeLord::new('Timelord');
$doctor->regenerate();
TimeLord::regenerate($doctor);
![Page 30: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/30.jpg)
6th April 2013 30
Simple Class
package Alien; # package
sub new { # subroutine my ($class, $name) = @_;
# hash reference my $self = { name => $name };
return bless $self, $class;}
![Page 31: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/31.jpg)
6th April 2013 31
Simple Class
sub name { # subroutine my ($self, $name) = @_;
if (defined $name) { $self->{name} = $name; }
return $self->{name}; # hash ref}
1;
![Page 32: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/32.jpg)
6th April 2013 32
Using Our Class
use Alien;
my $alien = Alien->new('Mork');
say $alien->name; # prints Mork
$alien->name('Mork from Ork');
say $alien->name;# prints Mork from Ork
![Page 33: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/33.jpg)
Moose
![Page 34: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/34.jpg)
6th April 2013 34
Moose
Moose is a Modern Object System for Perl 5 Based on Perl 6 object system More powerful More flexible Easier
![Page 35: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/35.jpg)
6th April 2013 35
Simple Moose Class
package Alien;use Moose;
has name => ( is => 'rw', isa => 'Str',);
no Moose;__PACKAGE__->meta->make_immutable;
![Page 36: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/36.jpg)
6th April 2013 36
What's Going On?
use Moose;
Loads Moose environment Makes our class a subclass of Moose::Object Turns on use strict and use warnings
![Page 37: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/37.jpg)
6th April 2013 37
Declarative Attributes
has name => ( is => 'rw', isa => 'Str',);
Creates an attribute called 'name' Makes it read/write Must be a string
![Page 38: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/38.jpg)
6th April 2013 38
Read/Write Attributes
Moose creates methods to access/alter attributes
$alien->name('Strax');say $alien->name;
The 'is' property controls how they work 'rw' : read and write 'ro' : read only
![Page 39: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/39.jpg)
6th April 2013 39
Private Attributes
Use is => 'bare' for attributes that aren't readable
No methods are created Direct hash access $alien->{name} = 'Commander Strax';
![Page 40: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/40.jpg)
6th April 2013 40
Other Methods
Not all methods are constructors or accessors/mutators
Write other methods as usual First parameter is object reference
![Page 41: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/41.jpg)
6th April 2013 41
Other Methods package Timelord;
...
sub regenerate { my $self = shift;
my $curr = $self->regeneration; $self->regeneration(++$curr);}
![Page 42: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/42.jpg)
6th April 2013 42
Housekeeping Moose classes carry a lot of baggage We can (and should) turn some of it off no Moose;
− Remove Moose exports from your namespace
− See also namespace::autoclean __PACKAGE__->meta->make_immutable;
− No more changes to class definition
Performance improvements
![Page 43: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/43.jpg)
6th April 2013 43
Using Our Class
From the user's perspective, nothing changes Use it just like other Perl classes use Alien;
my $strax = Alien->new( name => 'Strax');say $strax->name;
Named parameters are good
![Page 44: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/44.jpg)
Subclasses
![Page 45: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/45.jpg)
6th April 2013
Subclassing
A subclass is a specialisation of a superclass More specific behaviour New attributes New methods Overriding superclass methods and
attributes
![Page 46: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/46.jpg)
6th April 2013
Subclassing
Not all aliens are the same package Dalek;use Moose;extends 'Alien';
has accuracy => ( isa => 'Num', is => 'rw',);
![Page 47: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/47.jpg)
6th April 2013
Subclassing sub exterminate { my $self = shift;
say “EX-TERM-IN-ATE”; if (rand < $self->accuracy) { say “$_[0] has been exterminated”; return 1; } else { return; }}
![Page 48: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/48.jpg)
6th April 2013
Using Subclasses use Dalek;
my $karn = Dalek->new( name => 'Karn', accuracy => 0.9,);
say $karn->name;$karn->exterminate('The Doctor');
![Page 49: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/49.jpg)
6th April 2013
Overriding Methods
Daleks have a different way of using names A Dalek's name is always “Dalek
Something” Need to override the name method from
Alien But we still want to get the name itself from
Alien's method
![Page 50: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/50.jpg)
6th April 2013
Method Modifiers
Moose has a declarative way to modify methods from your superclass
before : run this code before the superclass method
after : run this code after the superclass method
around : run this code around the superclass method
![Page 51: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/51.jpg)
6th April 2013
Before and After
Methods defined with 'before' and 'after' are called before or after the parent's method
before name => sub { say 'About to call name()';};
Doesn't interact with parent's method
![Page 52: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/52.jpg)
6th April 2013
Around
Methods defined with 'around' are called instead of parent's method
It's your responsibility to call parent's method
Slightly different parameters− Original method name− Object reference− Any other parameters
![Page 53: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/53.jpg)
6th April 2013
Dalek Names
around name => sub { my $orig = shift; my $self = shift;
return 'Dalek ' . $self->$orig(@_);};
![Page 54: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/54.jpg)
6th April 2013
Overriding Methods
Simpler way to override parent methods override name => sub { my $self = shift;
return 'Dalek ' . super();};
Use the super keyword to call parent method
Passes on @_
![Page 55: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/55.jpg)
Attributes
![Page 56: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/56.jpg)
6th April 2013
Declarative Attributes
Attributes are declared in a class using the has keyword
This is different to “classic” Perl OO− Where attributes are created by the presence of
accessor methods
Attributes have a number of properties Properties define the attribute
![Page 57: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/57.jpg)
6th April 2013
Properties has name => ( isa => 'Str', is => 'rw',);
'isa' and 'is' are properties Many other options exist
![Page 58: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/58.jpg)
6th April 2013
is is : defines whether you can read or write
the attribute Actually defines whether accessor method is
created− And how it works
$obj->ro_attr('Some value');
“Cannot assign a value to a read-only accessor”
![Page 59: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/59.jpg)
6th April 2013
Private Attributes
Use is => 'bare' for private attributes− No accessor created
Still get access through the object hash has private => ( is => 'bare');
$self->private; # Error
$self->{private};
![Page 60: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/60.jpg)
6th April 2013
Accessor Name
“is” is actually a shortcut for two other properties
reader and writer has name => ( reader => 'get_name', writer => 'set_name',);
![Page 61: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/61.jpg)
6th April 2013
Accessor Name
Now we don't have a method called name say $obj->name; # Error
Need to use get_name− say $obj->get_name;
And set_name− $obj->set_name('New Name');
![Page 62: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/62.jpg)
6th April 2013
Best Practices
What is best practice− One method (name)
− Two methods (get_name, set_name)
Who cares? Choose one
− And stick with it
Perl Best Practices says two methods
− See MooseX::FollowPBP
![Page 63: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/63.jpg)
6th April 2013
Required Attributes
By default Moose attributes are optional Make them mandatory with required has name => ( required => 1,);
my $alien = Alien->new;
“Attribute (name) is required at constructor Alien::new”
![Page 64: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/64.jpg)
6th April 2013
Attribute Defaults Set a default for missing attributes has accuracy => ( default => 0.5,);
Or a subroutine reference has accuracy => ( default => sub { rand },);
![Page 65: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/65.jpg)
6th April 2013
Attribute Builder Define a builder method instead of a default
subroutine has accuracy => ( builder => '_build_accuracy',);
sub _build_accuracy { return rand;}
Easier to subclass
![Page 66: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/66.jpg)
6th April 2013
Predicate Define a method to check if an attribute has
been set− Check for defined value
has name => ( isa => 'Str', predicate => 'has_name',);
No default
![Page 67: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/67.jpg)
6th April 2013
Using Predicate
Use predicate method to check if an attribute is set
if ($random_alien->has_name) { say $random_alien->name;} else { say 'Anonymous Alien';}
![Page 68: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/68.jpg)
6th April 2013
Clearer Define a method to clear an attribute
− Sets to undef has name => ( is => 'Str', clearer => 'clear_name',);
No default
![Page 69: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/69.jpg)
6th April 2013
Using Clearer
Use clearer method to clear an attribute if ($anon_alien->has_name) { $anon_alien->clear_name;}
![Page 70: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/70.jpg)
6th April 2013
Attribute Types
Set the type of an attribute with isa has accuracy => ( isa => 'Num',);
Validation checks run as value is set We'll see more about types later
![Page 71: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/71.jpg)
6th April 2013
Aggregate Attributes
You can define aggregate attributes isa => 'ArrayRef'
− Reference to array (elements are any type) isa => 'ArrayRef[Int]'
− Reference to array (elements are integers)
![Page 72: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/72.jpg)
6th April 2013
Array Example Daleks like to keep track of their victims has victims ( is => 'rw', isa => 'ArrayRef[Str]', default => sub { [] },);
And in the exterminate() method push $self->victims, $_[0];
![Page 73: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/73.jpg)
6th April 2013
Array Example sub brag {
my $self = shift;
if (@{$self->victims}) { say $self->name, ' has killed ', scalar @{$self->victims}, ' enemies of the Daleks'; say 'Their names are: ', join(', ', @{$self->victims}); } else { say $self->name, ' has nothing to brag about'; }}
![Page 74: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/74.jpg)
6th April 2013
Hash Attributes Moose also supports hash ref attributes has some_attribute => ( isa => 'HashRef[Str]', is => 'rw',);
![Page 75: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/75.jpg)
6th April 2013
Easier Aggregates Attribute traits can make it easier to use
aggregate attributes We will revisit this later
![Page 76: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/76.jpg)
6th April 2013 76
Lazy Attributes Some attributes are rarely used And can be complex to construct It's a waste of resources to build them before
they are needed Mark them as lazy And define a build method
![Page 77: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/77.jpg)
6th April 2013 77
Lazy Attributes has useragent => ( is => 'LWP::UserAgent', lazy => 1, builder => '_build_ua',);
sub _build_ua { return LWP::UserAgent->new(...);}
$self->useragent->get(...);# creates object
![Page 78: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/78.jpg)
6th April 2013 78
Triggers A trigger is a subroutine that is called when
an attribute's value changes Subroutine is passed the old and new values has name => ( trigger => \&name_change,);
sub name_change { my ($self, $new, $old) = @_; warn “Name changed from $old to $new”;}
![Page 79: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/79.jpg)
6th April 2013 79
Overriding Attributes Subclasses can override attribute properties Use '+' on the subclass attribute definition has '+name' => ( ...);
Various properties can be changed− default, coerce, required, documentation, lazy,
isa, handles, builder, metaclass, traits
![Page 80: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/80.jpg)
6th April 2013 80
Sontaran Names Many aliens don't have names The 'name' attribute in Alien.pm doesn't
have the 'required' property Sontarans do use names package Sontaran;has '+name' => ( required => 1,);
![Page 81: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/81.jpg)
6th April 2013
More Types Attributes can also be objects has useragent => ( is => 'rw', isa => 'LWP::UserAgent',);
Or a union of types has output => ( is 'rw', isa => 'Object | Filehandle',);
![Page 82: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/82.jpg)
6th April 2013
Attribute Delegation
Pass method calls to attributes− Assumes the attributes are objects
Defined using the 'handles' property Defined with an array or hash reference
![Page 83: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/83.jpg)
6th April 2013
Delegation with Array
Array contains list of method names Named methods are passed through to
attribute object has useragent => ( is => 'rw', isa => 'LWP::UserAgent', handles => [ qw( get post ) ],);
![Page 84: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/84.jpg)
6th April 2013
Delegation with Array
$obj->get($url)
Is now equivalent to $obj->useragent->get($url)
![Page 85: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/85.jpg)
6th April 2013
Delegation with Hash
Allows renaming of methods Hash contains key/values pairs of method
names Key is our object's method name Value is the method name in the attribute
object
![Page 86: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/86.jpg)
6th April 2013
Delegation with Hash
has useragent => ( is => 'rw', isa => 'LWP::UserAgent', handles => { get_data => 'get', post_data => 'post', },);
![Page 87: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/87.jpg)
6th April 2013
Delegation with Hash
$obj->get_data($url)
Is now equivalent to $obj->useragent->get($url)
![Page 88: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/88.jpg)
Constructors
![Page 89: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/89.jpg)
6th April 2013 89
Constructors
A constructor is a special type of method It is usually a class method It returns a new object Moose classes prefer named parameters my $karn = Dalek->new( name => 'Karn', accuracy => 0.99,);
![Page 90: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/90.jpg)
6th April 2013 90
Default Constructor
The default Moose constructor builds an object from its parameters
Checks for mandatory attributes Checks type constraints Returns an object
![Page 91: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/91.jpg)
6th April 2013 91
Different Behaviour Some constructors need to do other
processing Not just build an object Sometimes it's convenient not to use named
parameters Use BUILD and BUILDARGS to override
Moose's default behaviour
![Page 92: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/92.jpg)
6th April 2013 92
BUILDARGS More flexible parameters Take a parameter list convert it to named
parameters Commonly Daleks only need a name my $karn = Dalek->new( name => 'Karn');
Why not simplify? my $karn = Dalek->new('Karn');
![Page 93: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/93.jpg)
6th April 2013 93
Dalek Construction We can use BUILDARGS to build a list of
named parameters around BUILDARGS => sub { my $orig = shift; my $class = shift;
if (@_ == 1 and !ref $_[0]) { return $class->$orig(name => $_[0]); } else { return $class->$orig(@_); }}
![Page 94: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/94.jpg)
6th April 2013 94
Default BUILDARGS We use 'around' to override BUILDARGS Allows superclass BUILDARGS to be
called Moose has a default (top level)
BUILDARGS Converts named params to a hash ref
− Alien->new(name => 'Mork')− Alien->new({name => 'Mork'})
![Page 95: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/95.jpg)
6th April 2013 95
Announcing Your Dalek
When a new Dalek is created we want to announce its name
We can use the BUILD method After a new object is constructed, the
BUILD method is called Use it to carry out any additional processing
![Page 96: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/96.jpg)
6th April 2013 96
BUILD Example
sub BUILD { my $self = shift;
say $self->name . ' is born.';}
This method is called every time a new Dalek object is created
Called after the object is constructed But before the new method returns
![Page 97: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/97.jpg)
6th April 2013 97
Constructor Sequence
BUILDARGS called Object constructed BUILD called
![Page 98: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/98.jpg)
Data Types
![Page 99: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/99.jpg)
6th April 2013
Moose Data Types
Moose types are arranged in a hierarchy− Like class inheritance
Easy to add our own types Easy to convert between types
![Page 100: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/100.jpg)
6th April 2013
Type Hierarchy (Top)
Any Item
− Bool− Maybe[`a]− Undef− Defined
Value Ref
![Page 101: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/101.jpg)
6th April 2013
Type Hierarchy (Value)
Value− Str
Num− Int
ClassName RoleName
![Page 102: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/102.jpg)
6th April 2013
Type Hierarchy (Ref)
Ref− ScalarRef[`a]− ArrayRef[`a]− HashRef[`a]− CodeRef− RegexpRef− GlobRef
FileHandle− Object
![Page 103: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/103.jpg)
6th April 2013
Parameterised Types
[`a] marks a parameter Maybe[Str] ScalarRef[Num] ArrayRef[Int]
− Array elements are integers
HashRef[Filehandle]− Hash values are filehandles
![Page 104: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/104.jpg)
6th April 2013
Defining Types
You can define your own data types Add constraints to existing types
![Page 105: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/105.jpg)
6th April 2013
Defining Types
Remember that Daleks have an accuracy Accuracy should be less than 1
− To give the Doctor a chance
Define your own type subtype 'Accuracy' => as 'Num' => where { $_ < 1 };
![Page 106: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/106.jpg)
6th April 2013
Using Types
has accuracy => ( isa => 'Accuracy',);
my $dalek = Dalek->new( accuracy => 1);
“Attribute (accuracy) does not pass the type constraint because: Validation failed for 'Accuracy' with value 1 at constructor Dalek::new”
![Page 107: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/107.jpg)
6th April 2013
Type Definition Tips
Name types within a project-specific namespace
− PerlSchool::DrWho::Accuracy
See Moose::Types for utilities to make type definition easier
![Page 108: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/108.jpg)
6th April 2013
Type Coercion
Convert between types Automatically
![Page 109: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/109.jpg)
6th April 2013
Dalek Birthdays
Daleks like to keep track of their creation date
They store it in a DateTime object has creation ( is => 'ro', isa => 'DateTime',);
![Page 110: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/110.jpg)
6th April 2013
Dalek Birthdays
It's hard to create a Dalek with a creation date
Dalek->new( name => "Karn", creation => "2013-04-06")
“2013-04-06” is not a DateTime object
![Page 111: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/111.jpg)
6th April 2013
Dalek Birthdays
Coerce a string into a DateTime coerce 'DateTime' => from 'Str' => via { DateTime::Format::Strptime->new( pattern => '%Y-%m-%d' )->parse_datetime($_)};
This doesn't work either
![Page 112: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/112.jpg)
6th April 2013
Dalek Birthdays
Can't coerce into a standard type Need to create a subtype That's just how Moose works
![Page 113: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/113.jpg)
6th April 2013
Dalek Birthdays subtype 'Creation' as => 'DateTime';
coerce 'Creation' => from 'Str' => via { DateTime::Format::Strptime->new( pattern => '%Y-%m-%d' )->parse_datetime($_)};
![Page 114: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/114.jpg)
6th April 2013
Dalek Birthdays
has creation => ( isa => 'Creation', is => 'ro', coerce => 1,};
Dalek->new( name => "Karn", creation => "2013-04-06");
![Page 115: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/115.jpg)
Roles
![Page 116: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/116.jpg)
6th April 2013
Inheritance
Inheritance is a useful feature of OO Easy to create specialised subclasses Easy to construct complex hierarchies of
classes Not so easy to maintain
![Page 117: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/117.jpg)
6th April 2013
Multiple Inheritance
It's possible for one class to inherit from many superclasses
This can lead to “diamond inheritance”− Class D subclasses classes B and C
− Classes B and C both subclass class A
− What happens?
Complexity and confusion
![Page 118: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/118.jpg)
6th April 2013
Roles
Roles address this issue Cut-down classes that can be added into a
class Roles cannot be instantiated A class “does” a role Like interfaces or mixins
![Page 119: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/119.jpg)
6th April 2013
Roles
Roles change the classes they are used by Add methods Add attributes Enforce method definition
![Page 120: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/120.jpg)
6th April 2013
Killer Aliens
Not all aliens are killers Need a role for those who are Force classes to implement a kill() method
![Page 121: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/121.jpg)
6th April 2013
Killer Aliens
package Alien::Role::Killer;
use Moose::Role;
requires 'kill';
package Dalek;
with 'Alien::Role::Killer';
![Page 122: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/122.jpg)
6th April 2013
Killer Aliens
Now we can't use the Dalek class until we have defined a kill() method
perl -MDalek -E'Dalek->new(“Karn”)
'Alien::Killer' requires the method 'kill' to be implemented by 'Dalek'
![Page 123: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/123.jpg)
6th April 2013
Killer Daleks
Let's cheat slightly Rename exterminate() to kill() Now we can use the Dalek class again
![Page 124: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/124.jpg)
6th April 2013
Counting Victims
Remember how Daleks keep track of their victims?
That behaviour really belongs in the Alien::Role::Killer role
All killer aliens keep track of their victims They just kill in different ways
![Page 125: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/125.jpg)
6th April 2013
Counting Victims
The class shouldn't know about the role's attributes
Remember this line from exterminate()− push $self->victims, $_
How do we deal with that? Use method modifiers
![Page 126: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/126.jpg)
6th April 2013
Counting Victims
In Alien::Role::Killer around kill => sub { my $orig = shift; my $self = shift;
if ($self->$orig(@_)) { push $self->victims, $_[0]; }};
![Page 127: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/127.jpg)
6th April 2013
Bragging About Victims
We also had a brag() method Used the victims array Move that into Alien::Role::Killer too
![Page 128: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/128.jpg)
6th April 2013
Alien::Killer package Alien::Role::Killer;
use 5.010;use Moose::Role;
requires 'kill';
has victims => ( isa => 'ArrayRef[Str]', is => 'rw', default => sub { [] },);
![Page 129: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/129.jpg)
6th April 2013
Alien::Killer around kill => sub { my $orig = shift; my $self = shift;
if ($self->$orig(@_)) { push $self->victims, $_[0]; }};
![Page 130: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/130.jpg)
6th April 2013
Alien::Killer sub brag { my $self = shift;
if (@{$self->victims}) { say $self->name . ' has killed ' . scalar @{$self->victims} . ' enemies of the '.ref($self).'s'; say 'Their names are: ', join(', ', @{$self->victims}); } else { say $self->name, ' has nothing to brag about'; }}
![Page 131: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/131.jpg)
6th April 2013
Alien::Killer sub brag { my $self = shift;
if (@{$self->victims}) { say $self->name . ' has killed ' . scalar @{$self->victims} . ' enemies of the '.ref($self).'s'; say 'Their names are: ', join(', ', @{$self->victims}); } else { say $self->name, ' has nothing to brag about'; }}
![Page 132: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/132.jpg)
6th April 2013
Dalek
package Dalek;
use Moose;
extends 'Alien';with 'Alien::Role::Killer';
...
![Page 133: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/133.jpg)
6th April 2013
Killing People #!/usr/bin/perl
use strict;use warnings;
use Dalek;
my $d = Dalek->new("Karn");
foreach (1 .. 10) { $d->kill("Timelord $_");}$d->brag;
![Page 134: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/134.jpg)
6th April 2013
Killing People $ ./killing.pl
Dalek Karn is born.EX-TERM-IN-ATEEX-TERM-IN-ATETimelord 2 has been exterminatedEX-TERM-IN-ATEEX-TERM-IN-ATEEX-TERM-IN-ATETimelord 5 has been exterminatedEX-TERM-IN-ATEEX-TERM-IN-ATEEX-TERM-IN-ATEEX-TERM-IN-ATETimelord 9 has been exterminatedEX-TERM-IN-ATETimelord 10 has been exterminatedDalek Karn has killed 4 enemies of the DaleksTheir names are: Timelord 2, Timelord 5, Timelord 9, Timelord 10
![Page 135: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/135.jpg)
6th April 2013
Nicer Aggregate Attrs
We've seen aggregate attributes− Array or hash
− victims is an example
We have to know that these are references− if (@{$self->victims})
− join ', ', @{self->victims}
− push $self->victims, $victim # Perl 5.14
Can we make this easier?
![Page 136: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/136.jpg)
6th April 2013
Nicer Aggregate Attrs
We can add traits to aggregate attribute definitions
Add simple methods to manipulate aggregate attributes
Hiding complexity
![Page 137: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/137.jpg)
6th April 2013
New Properties
traits : Reference to a list of traits to add
− Trait must match attribute type
− ArrayRef / Array
− HashRef / Hash
− Etc. handles : Maps new class methods onto trait
methods
![Page 138: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/138.jpg)
6th April 2013
Documentation
Moose::Meta::Trait::Native
− List of types
− High level examples Moose::Meta::Attribute::Native::Trait::*
− Full documentation of trait methods
![Page 139: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/139.jpg)
6th April 2013
Types
Array Bool Code Counter Hash Number String
![Page 140: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/140.jpg)
6th April 2013
Easier Victim Tracking has victims => ( isa => 'ArrayRef[Str]', is => 'rw', default => sub { [] }, traits => ['Array'], handles => { add_victim => 'push', all_victims => 'elements', count_victims => 'count', has_victims => 'count', },);
![Page 141: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/141.jpg)
6th April 2013
Easier Victim Tracking has victims => ( isa => 'ArrayRef[Str]', is => 'rw', default => sub { [] }, traits => ['Array'], handles => { add_victim => 'push', all_victims => 'elements', count_victims => 'count', has_victims => 'count', },);
![Page 142: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/142.jpg)
6th April 2013
Bragging (Before) sub brag { my $self = shift;
if (@{$self->victims}) { say $self->name, ' has killed ', scalar @{$self->victims}, ' enemies of the '.ref($self).'s'; say 'Their names are: ', join(', ', @{$self->victims}); } else { say $self->name, ' has nothing to brag about'; }}
![Page 143: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/143.jpg)
6th April 2013
Bragging (Before) sub brag { my $self = shift;
if (@{$self->victims}) { say $self->name, ' has killed ', scalar @{$self->victims}, ' enemies of the '.ref($self).'s'; say 'Their names are: ', join(', ', @{$self->victims}); } else { say $self->name, ' has nothing to brag about'; }}
![Page 144: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/144.jpg)
6th April 2013
Bragging (After) sub brag { my $self = shift;
if ($self->has_victims) { say $self->name . ' has killed ' . $self->count_victims, ' enemies of the '.ref($self).'s'; say 'Their names are: ', join(', ', $self->all_victims); } else { say $self->name, ' has nothing to brag about'; }}
![Page 145: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/145.jpg)
6th April 2013
Bragging (After) sub brag { my $self = shift;
if ($self->has_victims) { say $self->name . ' has killed ' . $self->count_victims, ' enemies of the '.ref($self).'s'; say 'Their names are: ', join(', ', $self->all_victims); } else { say $self->name, ' has nothing to brag about'; }}
![Page 146: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/146.jpg)
6th April 2013
Killing (Before) around kill => sub { my $orig = shift; my $self = shift;
if ($self->$orig(@_)) { push $self->victims, $_[0]; }};
![Page 147: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/147.jpg)
6th April 2013
Killing (Before) around kill => sub { my $orig = shift; my $self = shift;
if ($self->$orig(@_)) { push $self->victims, $_[0]; }};
![Page 148: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/148.jpg)
6th April 2013
Killing (After) around kill => sub { my $orig = shift; my $self = shift;
if ($self->$orig(@_)) { $self->add_victim($_[0]); }};
![Page 149: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/149.jpg)
6th April 2013
Killing (After) around kill => sub { my $orig = shift; my $self = shift;
if ($self->$orig(@_)) { $self->add_victim($_[0]); }};
![Page 150: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/150.jpg)
Meta Programming
![Page 151: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/151.jpg)
6th April 2013
Meta Object Protocol
Moose is built on Class::MOP A Meta Object Protocol A set of classes that model a class
framework Class introspection
![Page 152: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/152.jpg)
6th April 2013
The Meta Object
Access the MOP through your class's “meta” object
Get it through the meta() method− Class or object method
my $meta = Dalek->meta;
![Page 153: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/153.jpg)
6th April 2013
Querying Classes
Class name $meta->name
say Dalek->new->meta->name;
Superclasses $meta->superclasses @super = Dalek->new->meta->superclasses;say $super[0]->name; # Alien
![Page 154: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/154.jpg)
6th April 2013
Querying Attributes
Get list of attributes Each attribute is an object foreach my $attr ( $meta->get_all_attributes) { say $attr->name; say $attr->reader; say $attr->writer;}
![Page 155: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/155.jpg)
6th April 2013
Querying Methods
Get a list of methods Each method is an object foreach my $meth ( $meta->get_all_methods) { say $meth->name; say $meth->package_name; say $meth->body;}
![Page 156: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/156.jpg)
6th April 2013
MOP is Read/Write
The MOP objects aren't read-only You can change classes too
− Until you call make_immutable
That's how Moose defines classes See Class::MOP documentation
![Page 157: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/157.jpg)
Moose Plugins
![Page 158: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/158.jpg)
6th April 2013
Moose Plugins
Moose has a number of useful plugins Many in the MooseX::* namespace
− Important to pronounce that carefully
New ones added frequently A survey of some of them
![Page 159: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/159.jpg)
6th April 2013
Strict Constructors
Standard Moose ignores unknown constructor parameters
Dalek->new( name => 'Karn', email => '[email protected]', # huh?)
MooseX::StrictConstructor throws an error
![Page 160: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/160.jpg)
6th April 2013
Parameter Validation
By default Perl is not strict about parameters to subroutines
Params::Validate is a useful CPAN module MooseX::Params::Validate is a Moose
wrapper
![Page 161: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/161.jpg)
6th April 2013
Parameter Validation package Foo;
use Moose;use MooseX::Params::Validate;
sub foo { my ( $self, %params ) = validated_hash( \@_, bar => { isa => 'Str', default => 'Moose' }, ); return "Hooray for $params{bar}!";}
![Page 162: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/162.jpg)
6th April 2013
Singleton Object
A class that only ever has one instance Highlander variable
− “There can be only one” MooseX::Singleton use MooseX::Singleton;
![Page 163: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/163.jpg)
6th April 2013
Nicer Class Definitions
In Moose a class is still a package In Moose a method is still a subroutine MooseX::Declare adds new keywords Make your classes look more like classes Make your methods look more like methods
![Page 164: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/164.jpg)
6th April 2013
Nicer Class Definitions class User { has 'name' => ( ... ); has 'email' => ( ... ); method login (Str $password) { ... }}
Still considered experimental See also MooseX::Method::Signatures
![Page 165: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/165.jpg)
6th April 2013
A Few More
MooseX::Types MooseX::Types::Structures
− Easier subtype definitions MooseX::ClassAttributes
![Page 166: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/166.jpg)
6th April 2013
A Few More
MooseX::Daemonize MooseX::FollowPBP MooseX::NonMoose
− Moose subclasses of non-Moose classes
![Page 167: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/167.jpg)
Alternativesto Moose
![Page 168: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/168.jpg)
6th April 2013
Performance
Moose is relatively heavyweight Adds a lot to your application no moose and make_immutable both help
Moose team working on performance improvements
Lightweight alternatives
![Page 169: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/169.jpg)
6th April 2013
Moo
“Minimalist Object Orientation (with Moose compatibility)”
Lightweight subset of Moose Optimised for rapid start-up No meta-object
− Unless Moose is loaded Support for roles
![Page 170: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/170.jpg)
6th April 2013
Mo
Even smaller subset of Moose new
has− All arguments are ignored
extends
Sometimes that is enough
![Page 171: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/171.jpg)
6th April 2013
Mouse & Any::Moose
Mouse was an earlier light-weight Moose clone
Nowhere near as light-weight as Moo Cut-down meta object Any::Moose switches between Mouse and
Moose Moo is usually better
Minimalist Object Orientation (with Moose compatiblity)
![Page 172: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/172.jpg)
Further Information
![Page 173: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/173.jpg)
6th April 2013 173
More Moose
Moose does a lot more We have only scratched the surface Good documentation
− CPAN
− Moose::Manual::*
− Moose::Cookbook::*
No good book yet
![Page 174: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/174.jpg)
6th April 2013 174
Help on Moose
Moose web site− http://moose.perl.org/
Mailing list− http://lists.perl.org/list/moose.html
IRC Channel− #moose on irc.perl.org
![Page 175: Object-Oriented Programming with Perl and Moose](https://reader034.vdocuments.us/reader034/viewer/2022050613/554f3875b4c905471e8b484a/html5/thumbnails/175.jpg)
That's All Folks
• Any Questions?