Introduction to    OO Perl  With Moose        Dave Cross   Magnum Solutions Ltd    dave@mag-sol.com
What We Will Cover           Introduction to Object Oriented            programming           Overview of Moose        ...
Object Oriented Programming
What is OOP?           “Traditional” programming is procedural           Subroutines work on variables           my $tw...
What is OOP?           Object Oriented programming inverts this           Variables are objects           Objects can c...
Some Concepts           A Class is a type of intelligent variable                e.g. Time Lord           An Object is ...
Some Concepts           A class contains a number of methods           An object is of a particular class           The...
Methods          Methods can be either class methods or           object methods          Class methods are called on a ...
Constructors          All classes need a constructor method          Creates a new object of that class          Usuall...
Constructors           A Class might have multiple constructors           my $doctor = TimeLord->new;           my $fle...
Accessors & Mutators           Access object attributes with an accessor            method           say “The time lords...
Accessor/Mutators           Accessors and mutators are often the same            method           say “The time lords na...
Accessor/Mutators           Which to choose?           Perl Best Practices says get_foo/set_foo           I like one me...
Subclasses           A subclass is a specialisation of a class           “Alien” is a class           “Dalek” is one po...
Object Oriented     Perl
OO Perl           Three rules of OO Perl           A class is a package           An object is reference           A m...
A Class is a Package           Same as any other package           Contains subroutines                Methods        ...
An Object is a Reference           Usually a reference to a hash           Hash keys are attribute names           Hash...
A Method is a Subroutine           Just like any other subroutine           Some rules on parameters           First pa...
Simple Class           package Alien;            sub new {              my ($class, $name) = @_;                 my $self...
Simple Class           sub name {              my ($self, $name) = @_;                 if (defined $name) {              ...
Using Our Class           use Alien;            my $alien = Alien->new(Mork);            say $alien->name; # prints Mork ...
Moose
Moose           Moose is a Modern Object System for Perl 5           Based on Perl 6 object system           More power...
Simple Moose Class           package Alien;            use Moose;            has name => (               is => rw,       ...
Whats Going On?           use Moose;           Loads Moose environment           Makes our class a subclass of Moose::O...
Declarative Attributes           has name => (               is => rw,               isa => Str,            );          ...
Read/Write Attributes           Moose creates method to access/alter            attributes           $alien->name(Strax)...
Private Attributes           Use is => bare for attributes that arent            readable           No methods are creat...
Housekeeping           Moose classes carry a lot of baggage           We can (and should) turn some of it off          ...
Using Our Class           From the users perspective, nothing changes           Use it just like other Perl classes     ...
Subclasses
Subclassing           A subclass is a specialisation of a superclass           More specific behaviour           New at...
Subclassing           Not all aliens are the same           package Dalek;            use Moose;            extends Alie...
Subclassing           sub exterminate {              my $self = shift;                say “EX-TERM-IN-ATE”;              ...
Using Subclasses           use Dalek;            my $karn = Dalek->new(               name => Karn, accuracy => 0.9,     ...
Overriding Methods           Daleks have a different way of using names           A Daleks name is always “Dalek        ...
Method Modifiers           Moose has a declarative way to modify            methods from your superclass           befor...
Dalek Names           around name => sub {              my $orig = shift;              my $class = shift;                ...
Attributes
Declarative Attributes           Attributes are declared in a class using the            has keyword           This is d...
Properties           has name => (               isa => Str,               is => rw,            );           isa and is ...
is            is : defines if you can read or write the             attribute            Actually defines whether access...
Accessor Name           “is” is actually a shortcut for two other            properties           reader and writer     ...
Accessor Name           Now we dont have a method called name           say $obj->name; # Error           Need to use g...
Best Practices           What is best practice                 One method (name)                 Two methods (get_name,...
Required Attributes           By default Moose attributes are optional           Make them mandatory with required      ...
Attribute Defaults           Set a default for missing attributes           has accuracy => (               default => 0...
Attribute Builder           Define a builder method instead of a default            subroutine           has accuracy =>...
Attribute Types           Set the type of an attribute with isa           has accuracy => (               isa => Num,   ...
Defining Types           Accuracy should be less than 1                 To give the Doctor a chance           Define yo...
Using Types           has accuracy => (               isa => Accuracy,            );           my $dalek = Dalek->new(  ...
Aggregate Attributes            You can define aggregate attributes            isa => ArrayRef               Reference ...
Array Example           Daleks like to keep track of their victims           has victims (               is => rw,      ...
Array Example           sub brag {              my $self = shift;                 if (@{$self->victims}) {               ...
Hash Attributes           Moose also supports hash ref attributes           has some_attribute => (               isa =>...
More Types           Attributes can also be objects           has useragent => (               is => rw,               i...
Lazy Attributes           Some attributes are rarely used           And can be complex to construct           Its a was...
Lazy Attributes           has useragent => (               is => LWP::UserAgent,               lazy => 1,               b...
Triggers           A trigger is a subroutine that is called when            an attributes value changes           Subrou...
Constructors
Constructors           A constructor is a special type of method           It is usually a class method           It re...
Default Constructor           The default Moose constructor builds an            object from its parameters           Ch...
Different Behaviour         Some constructors need to do other          processing         Not just build an object     ...
BUILDARGS           More flexible parameters           Take a parameter list convert it to named            parameters  ...
Dalek Construction            We can use BUILDARGS to build a list of             named parameters            around BUI...
Announcing Your Dalek           When a new Dalek is created we want to            announce its name           We can use...
BUILD Example           sub BUILD {              my $self = shift;                 say $self->name .  is born.;          ...
FurtherInformation
More Moose           Moose does a lot more           We have only scratched the surface           Good documentation   ...
More Moose           Type hierarchy           Type coercion           Method modifiers           Method delegation    ...
Perl School           Object Oriented Programming with Perl            and Moose           8th December           Googl...
Thats All Folks• Any Questions?
Upcoming SlideShare
Loading in...5
×

Introduction to OO Perl with Moose

5,496

Published on

Introduction to Moose course from the London Perl Workshop 2012.

Published in: Technology
1 Comment
9 Likes
Statistics
Notes
No Downloads
Views
Total Views
5,496
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
108
Comments
1
Likes
9
Embeds 0
No embeds

No notes for slide

Introduction to OO Perl with Moose

  1. 1. Introduction to OO Perl With Moose Dave Cross Magnum Solutions Ltd dave@mag-sol.com
  2. 2. What We Will Cover  Introduction to Object Oriented programming  Overview of Moose  Object Attributes  Subclasses  Further informationLondon Perl Workshop 24th November 2012 2
  3. 3. Object Oriented Programming
  4. 4. What is OOP?  “Traditional” programming is procedural  Subroutines work on variables  my $twelve = regenerate($eleven);  Variables are dumb  Just stores for dataLondon Perl Workshop 24th November 2012 4
  5. 5. 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 outLondon Perl Workshop 24th November 2012 5
  6. 6. 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. NameLondon Perl Workshop 24th November 2012 6
  7. 7. 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  A class can also have attributesLondon Perl Workshop 24th November 2012 7
  8. 8. 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;London Perl Workshop 24th November 2012 8
  9. 9. 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;London Perl Workshop 24th November 2012 9
  10. 10. 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;London Perl Workshop 24th November 2012 10
  11. 11. Accessors & Mutators  Access object attributes with an accessor method  say “The time lords name is “, $doctor->get_name;  Change an attribute with a mutator method  $doctor->set_age( $doctor->get_age + 1 );London Perl Workshop 24th November 2012 11
  12. 12. Accessor/Mutators  Accessors and mutators are often the same method  say “The time lords name is “, $doctor->name;  $doctor->age($doctor->age + 1);  Checks number of parameters  Reacts appropriatelyLondon Perl Workshop 24th November 2012 12
  13. 13. 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 itLondon Perl Workshop 24th November 2012 13
  14. 14. Subclasses  A subclass is a specialisation of a class  “Alien” is a class  “Dalek” is one possible subclass  Avoid reimplementing shared methodsLondon Perl Workshop 24th November 2012 14
  15. 15. Object Oriented Perl
  16. 16. OO Perl  Three rules of OO Perl  A class is a package  An object is reference  A method is a subroutineLondon Perl Workshop 24th November 2012 16
  17. 17. A Class is a Package  Same as any other package  Contains subroutines  Methods  Contains variables  Class attributesLondon Perl Workshop 24th November 2012 17
  18. 18. 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 isLondon Perl Workshop 24th November 2012 18
  19. 19. 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()London Perl Workshop 24th November 2012 19
  20. 20. Simple Class  package Alien; sub new { my ($class, $name) = @_; my $self = { name => $name }; return bless $self, $class; }London Perl Workshop 24th November 2012 20
  21. 21. Simple Class  sub name { my ($self, $name) = @_; if (defined $name) { $self->{name} = $name; } return $self->{name}; } 1;London Perl Workshop 24th November 2012 21
  22. 22. 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 OrkLondon Perl Workshop 24th November 2012 22
  23. 23. Moose
  24. 24. Moose  Moose is a Modern Object System for Perl 5  Based on Perl 6 object system  More powerful  More flexible  EasierLondon Perl Workshop 24th November 2012 24
  25. 25. Simple Moose Class  package Alien; use Moose; has name => ( is => rw, isa => Str, ); no Moose; __PACKAGE__->meta->make_immutable;London Perl Workshop 24th November 2012 25
  26. 26. Whats Going On?  use Moose;  Loads Moose environment  Makes our class a subclass of Moose::Object  Turns on use strict and use warningsLondon Perl Workshop 24th November 2012 26
  27. 27. Declarative Attributes  has name => ( is => rw, isa => Str, );  Creates an attribute called name  Makes it read/write  Must be a stringLondon Perl Workshop 24th November 2012 27
  28. 28. Read/Write Attributes  Moose creates method to access/alter attributes  $alien->name(Strax); say $alien->name;  The is property controls how they work  rw : read and write  ro : read onlyLondon Perl Workshop 24th November 2012 28
  29. 29. Private Attributes  Use is => bare for attributes that arent readable  No methods are created  Direct hash access  $alien->{name} = Commander Strax;London Perl Workshop 24th November 2012 29
  30. 30. 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 improvementsLondon Perl Workshop 24th November 2012 30
  31. 31. Using Our Class  From the users perspective, nothing changes  Use it just like other Perl classes  use Alien; my $strax = Alien->new( name => Strax ); say $strax->name;  Named parameters are goodLondon Perl Workshop 24th November 2012 31
  32. 32. Subclasses
  33. 33. Subclassing  A subclass is a specialisation of a superclass  More specific behaviour  New attributes  New methods  Overriding superclass methodsLondon Perl Workshop 24th November 2012
  34. 34. Subclassing  Not all aliens are the same  package Dalek; use Moose; extends Alien; has accuracy => ( isa => Num, is => rw, );London Perl Workshop 24th November 2012
  35. 35. Subclassing  sub exterminate { my $self = shift; say “EX-TERM-IN-ATE”; if (rand < $self->accuracy) { say “$_[0] has been exterminated”; return 1; } else { return; } }London Perl Workshop 24th November 2012
  36. 36. Using Subclasses  use Dalek; my $karn = Dalek->new( name => Karn, accuracy => 0.9, ); say $karn->name; $karn->exterminate(The Doctor);London Perl Workshop 24th November 2012
  37. 37. Overriding Methods  Daleks have a different way of using names  A Daleks name is always “Dalek Something”  Need to override the name method from Alien  But we still want to get the name itself from Aliens methodLondon Perl Workshop 24th November 2012
  38. 38. 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 methodLondon Perl Workshop 24th November 2012
  39. 39. Dalek Names  around name => sub { my $orig = shift; my $class = shift; return Dalek . $class->$orig(@_); };London Perl Workshop 24th November 2012
  40. 40. Attributes
  41. 41. 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 attributeLondon Perl Workshop 24th November 2012
  42. 42. Properties  has name => ( isa => Str, is => rw, );  isa and is are properties  Many other options existLondon Perl Workshop 24th November 2012
  43. 43. is  is : defines if 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”  Use is => bare for private attributes  No accessor createdLondon Perl Workshop 24th November 2012
  44. 44. Accessor Name  “is” is actually a shortcut for two other properties  reader and writer  has name => ( reader => get_name, writer => set_name, );London Perl Workshop 24th November 2012
  45. 45. Accessor Name  Now we dont 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);London Perl Workshop 24th November 2012
  46. 46. 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::FollowPBPLondon Perl Workshop 24th November 2012
  47. 47. 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”London Perl Workshop 24th November 2012
  48. 48. Attribute Defaults  Set a default for missing attributes  has accuracy => ( default => 0.5, );  Or a subroutine reference  has accuracy => ( default => sub { rand }, );London Perl Workshop 24th November 2012
  49. 49. Attribute Builder  Define a builder method instead of a default subroutine  has accuracy => ( builder => _build_accuracy, );  sub _build_accuracy { return rand; }  Easier to subclassLondon Perl Workshop 24th November 2012
  50. 50. Attribute Types  Set the type of an attribute with isa  has accuracy => ( isa => Num, );  Validation checks run as value is setLondon Perl Workshop 24th November 2012
  51. 51. Defining Types  Accuracy should be less than 1  To give the Doctor a chance  Define your own type  subtype Accuracy => as Num => where { $_ < 1 };London Perl Workshop 24th November 2012
  52. 52. 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”London Perl Workshop 24th November 2012
  53. 53. 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)London Perl Workshop 24th November 2012
  54. 54. 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];London Perl Workshop 24th November 2012
  55. 55. 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; } }London Perl Workshop 24th November 2012
  56. 56. Hash Attributes  Moose also supports hash ref attributes  has some_attribute => ( isa => HashRef[Str], is => rw, );London Perl Workshop 24th November 2012
  57. 57. 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, );London Perl Workshop 24th November 2012
  58. 58. Lazy Attributes  Some attributes are rarely used  And can be complex to construct  Its a waste of resources to build them before they are needed  Mark them as lazy  And define a build methodLondon Perl Workshop 24th November 2012 58
  59. 59. Lazy Attributes  has useragent => ( is => LWP::UserAgent, lazy => 1, builder => _build_ua, );  sub _build_ua { return LWP::UserAgent->new(...); }  $self->useragent->get(...); # creates objectLondon Perl Workshop 24th November 2012 59
  60. 60. Triggers  A trigger is a subroutine that is called when an attributes 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”; }London Perl Workshop 24th November 2012 60
  61. 61. Constructors
  62. 62. 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, );London Perl Workshop 24th November 2012 62
  63. 63. Default Constructor  The default Moose constructor builds an object from its parameters  Checks for mandatory attributes  Checks type constraints  Returns an objectLondon Perl Workshop 24th November 2012 63
  64. 64. Different Behaviour  Some constructors need to do other processing  Not just build an object  Sometimes its convenient not to use named parameters  Use BUILD and BUILDARGS to override Mooses default behaviourLondon Perl Workshop 24th November 2012 64
  65. 65. 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);London Perl Workshop 24th November 2012 65
  66. 66. 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(@_); } }London Perl Workshop 24th November 2012 66
  67. 67. 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 processingLondon Perl Workshop 24th November 2012 67
  68. 68. 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 returnsLondon Perl Workshop 24th November 2012 68
  69. 69. FurtherInformation
  70. 70. More Moose  Moose does a lot more  We have only scratched the surface  Good documentation  CPAN  Add-on modules  MooseX::*London Perl Workshop 24th November 2012 70
  71. 71. More Moose  Type hierarchy  Type coercion  Method modifiers  Method delegation  Overriding attributes  Roles and traits  Meta programmingLondon Perl Workshop 24th November 2012 71
  72. 72. Perl School  Object Oriented Programming with Perl and Moose  8th December  Google Campus, London  Full day course  £30  http://perlschool.co.uk/London Perl Workshop 24th November 2012 72
  73. 73. Thats All Folks• Any Questions?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×