Slide 1

Slide 1 text

OO Perl with Moose Nelo Onyiah

Slide 2

Slide 2 text

OO Perl with Moose What is Moose?

Slide 3

Slide 3 text

OO Perl with Moose What is Moose? Moose is a postmodern object system for Perl 5 that takes the tedium out of writing object-oriented Perl. It borrows all the best features from Perl 6, CLOS (LISP), Smalltalk, Java, BETA, OCaml, Ruby and more, while still keeping true to its Perl 5 roots.

Slide 4

Slide 4 text

OO Perl with Moose Why Moose?

Slide 5

Slide 5 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful

Slide 6

Slide 6 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful ● define your class declaratively

Slide 7

Slide 7 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful ● define your class declaratively ● offers "sugar" for object construction, attributes, e.t.c

Slide 8

Slide 8 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful ● define your class declaratively ● offers "sugar" for object construction, attributes, e.t.c ● don't need to care how they are implemented

Slide 9

Slide 9 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful ● define your class declaratively ● offers "sugar" for object construction, attributes, e.t.c ● don't need to care how they are implemented ● concentrate on the logical structure of your classes

Slide 10

Slide 10 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful ● define your class declaratively ● offers "sugar" for object construction, attributes, e.t.c ● don't need to care how they are implemented ● concentrate on the logical structure of your classes ● don't need to be a wizard to use it

Slide 11

Slide 11 text

OO Perl with Moose Why Moose? ● makes Perl 5 OO both simpler and more powerful ● define your class declaratively ● offers "sugar" for object construction, attributes, e.t.c ● don't need to care how they are implemented ● concentrate on the logical structure of your classes ● don't need to be a wizard to use it ● but if you are, lets you dig about in the guts and extend it

Slide 12

Slide 12 text

OO Perl with Moose package Person; 1; To make a class you start with a package

Slide 13

Slide 13 text

OO Perl with Moose package Person; use Moose; 1; To make a class you start with a package and just use Moose

Slide 14

Slide 14 text

OO Perl with Moose package Person; use Moose; 1; This is a complete class definition

Slide 15

Slide 15 text

OO Perl with Moose package Person; use Moose; 1; This is a complete class definition not terribly useful though

Slide 16

Slide 16 text

OO Perl with Moose package Person; use Moose; 1; Under the hood Moose is doing a lot

Slide 17

Slide 17 text

OO Perl with Moose package Person; use Moose; 1; Under the hood Moose is doing a lot (won't go into that though)

Slide 18

Slide 18 text

OO Perl with Moose package Person; use Moose; 1; Classes have zero or more attributes

Slide 19

Slide 19 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( ); 1; Attributes are declared using the has function

Slide 20

Slide 20 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( ); 1; Attributes are declared using the has function Attributes have properties

Slide 21

Slide 21 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( ); 1; Attributes are declared using the has function Attributes have properties probably the most powerful feature of Moose

Slide 22

Slide 22 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( ); 1; Can be provided with accessors

Slide 23

Slide 23 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( is => 'rw', ); 1; Can be provided with accessors by stating that attribute is read-writeable

Slide 24

Slide 24 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( is => 'ro', ); 1; or read-only

Slide 25

Slide 25 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( is => 'ro', writer => '_set_birth_date', ); 1; or you can provide your own reader and/or writer

Slide 26

Slide 26 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( is => 'ro', isa => 'Str', ); 1; You can specify a type for your attribute

Slide 27

Slide 27 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( is => 'ro', isa => 'Str', ); 1; Only values that pass the type check will be accepted for the attribute

Slide 28

Slide 28 text

OO Perl with Moose package Person; use Moose; has 'birth_date' => ( is => 'ro', isa => 'Str', ); 1; Built in types include: ● Str ● Num ● ArrayRef ● CodeRef ● Any ● more ...

Slide 29

Slide 29 text

OO Perl with Moose package Person; use Moose; use DateTime; has 'birth_date' => ( is => 'ro', isa => 'DateTime', ); 1; Class names are treated as types

Slide 30

Slide 30 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' has 'birth_date' => ( is => 'ro', isa => 'DateTime', ); 1; You can create your own types

Slide 31

Slide 31 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' has 'birth_date' => ( is => 'ro', isa => 'DateTime', ); 1; You can create your own types from existing types

Slide 32

Slide 32 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'DateTime', ); 1; You can create your own types from existing types and apply your own constraints on them

Slide 33

Slide 33 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', ); 1; You can create your own types from existing types and apply your own constraints on them and use them

Slide 34

Slide 34 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', ); 1; You can also coerce one type into another

Slide 35

Slide 35 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', ); 1; See Moose::Manual::Types for more details

Slide 36

Slide 36 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', ); 1; A person with no birth date seems odd

Slide 37

Slide 37 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, ); 1; A person with no birth date seems odd so it can be made compulsary with the required flag

Slide 38

Slide 38 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, default => '2000-01-01', ); 1; You can also set default values for the attribute

Slide 39

Slide 39 text

OO Perl with Moose package Person; use Moose; use Moose::Util::TypeConstraints; use DateTime; subtype 'ModernDateTime' => as 'DateTime' => where { $_->year >= 2000 }; has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, default => sub { DateTime->now }, ); 1; Complex defaults need to be set in a sub ref

Slide 40

Slide 40 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, builder => '_build_birth_date', ); sub _build_birth_date { DateTime->now; } 1; or you could write a separate builder method

Slide 41

Slide 41 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, builder => '_build_birth_date', lazy => 1, ); sub _build_birth_date { DateTime->now; } 1; and make it lazy

Slide 42

Slide 42 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, lazy_build => 1, ); sub _build_birth_date { DateTime->now; } 1; or in one step

Slide 43

Slide 43 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, lazy_build => 1, handles => { birth_year => 'year' }, ); sub _build_birth_date { DateTime->now; } 1; Attributes handle delegation

Slide 44

Slide 44 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, lazy_build => 1, handles => { birth_year => 'year' }, ); sub _build_birth_date { DateTime->now; } 1; Attributes handle delegation Calling $person- >birth_year delegates to $person->birth_date->year

Slide 45

Slide 45 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, lazy_build => 1, handles => { birth_year => 'year' }, ); sub _build_birth_date { DateTime->now; } 1; Delegation is one option to inheritance

Slide 46

Slide 46 text

OO Perl with Moose package Person; use Moose; # subtype ... has 'birth_date' => ( is => 'ro', isa => 'ModernDateTime', required => 1, lazy_build => 1, handles => { birth_year => 'year' }, ); sub _build_birth_date { DateTime->now; } 1; Delegation is one option to inheritance Especially when inheriting from non-Moose based classes

Slide 47

Slide 47 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); 1; Inheritance is achieved with the extends function

Slide 48

Slide 48 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); 1; Inheritance is achieved with the extends function Moose supports multiple inheritance

Slide 49

Slide 49 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); 1; Inheritance is achieved with the extends function Moose supports multiple inheritance just pass more class names to extends

Slide 50

Slide 50 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); override '_build_birth_date' => sub { # ... } 1; Override parent methods with the override function

Slide 51

Slide 51 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); override '_build_birth_date' => sub { # ... super(); } 1; Call the parent method with the super function

Slide 52

Slide 52 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); has '+birth_date' => ( # ... ); 1; You can also override attributes

Slide 53

Slide 53 text

OO Perl with Moose package Employee; use Moose; extends qw( Person ); has '+birth_date' => ( # ... ); 1; You can also override attributes (carefully)

Slide 54

Slide 54 text

OO Perl with Moose package Science; 1; Moose also has a concept of roles

Slide 55

Slide 55 text

OO Perl with Moose package Science; use Moose::Role; 1; Moose also has a concept of roles Declared by using Moose:: Role

Slide 56

Slide 56 text

OO Perl with Moose package Science; use Moose::Role; 1; Similar to Smalltalk traits, Ruby Mixins and Java interfaces

Slide 57

Slide 57 text

OO Perl with Moose package Science; use Moose::Role; 1; Similar to Smalltalk traits, Ruby Mixins and Java interfaces Most similar to Perl 6 Roles

Slide 58

Slide 58 text

OO Perl with Moose package Science; use Moose::Role; 1; A collection of reusable traits (attributes)

Slide 59

Slide 59 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); 1; A collection of reusable traits (attributes)

Slide 60

Slide 60 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; A collection of reusable traits (attributes) and behaviour (methods)

Slide 61

Slide 61 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles are not classes

Slide 62

Slide 62 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles are not classes ● cannot instantiate a role

Slide 63

Slide 63 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles are not classes ● cannot instantiate a role ● cannot inherit from a role

Slide 64

Slide 64 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles are another option to inheritance

Slide 65

Slide 65 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles are composed into consuming classes/roles

Slide 66

Slide 66 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles are composed into consuming classes/roles Attributes and methods from role are flattened into consuming class/role

Slide 67

Slide 67 text

OO Perl with Moose package Science; use Moose::Role; has 'speciality' => ( # ... ); sub research { # ... } 1; Roles can insist that consuming classes implement certain methods

Slide 68

Slide 68 text

OO Perl with Moose package Science; use Moose::Role; requires qw( research ); has 'speciality' => ( # ... ); 1; Roles can insist that consuming classes implement certain methods Use the requires function

Slide 69

Slide 69 text

OO Perl with Moose package Science; use Moose::Role; requires qw( research ); has 'speciality' => ( # ... ); 1; Roles can insist that consuming classes implement certain methods Use the requires function Consuming classes must now implement the research function

Slide 70

Slide 70 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Roles are consumed into classes by using the with keyword

Slide 71

Slide 71 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Roles are consumed into classes by using the with keyword More than one role can be consumed into a class

Slide 72

Slide 72 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Roles are consumed into classes by using the with keyword More than one role can be consumed into a class just pass more roles to with

Slide 73

Slide 73 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Class methods and attributes are prioritized

Slide 74

Slide 74 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Class methods and attributes are prioritized Conflicts are resolved at compile time

Slide 75

Slide 75 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; See Moose::Manual::Roles for details

Slide 76

Slide 76 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Moose is not perfect

Slide 77

Slide 77 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Moose is not perfect Biggest caveat is start up time

Slide 78

Slide 78 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Moose is not perfect Biggest caveat is start up time Actively being worked on

Slide 79

Slide 79 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } 1; Moose is not perfect Biggest caveat is start up time Actively being worked on But you can help

Slide 80

Slide 80 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } __PACKAGE__->meta->make_immutable(); 1; Make your classes immutable

Slide 81

Slide 81 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } __PACKAGE__->meta->make_immutable(); 1; Make your classes immutable This lets Moose create an inline constructor for your class

Slide 82

Slide 82 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } __PACKAGE__->meta->make_immutable(); 1; Make your classes immutable This lets Moose create an inline constructor for your class Greatly speeding up start up time

Slide 83

Slide 83 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } __PACKAGE__ ->meta->make_immutable(); 1; Also you are adviced to clean up after your class i.e remove all Moose sugar from packages using your classes

Slide 84

Slide 84 text

OO Perl with Moose package Scientist; use Moose; extends qw( Person ); with qw( Science ); sub research { ... } __PACKAGE__ ->meta->make_immutable(); no Moose; 1; Also you are adviced to clean up after your class i.e remove all Moose sugar from packages using your classes

Slide 85

Slide 85 text

OO Perl with Moose package Scientist; use Moose; use namespace::clean -except => [qw( meta )]; extends qw( Person ); with qw( Science ); sub research { ... } __PACKAGE__ ->meta->make_immutable(); 1; Also you are adviced to clean up after your class i.e remove all Moose sugar from packages using your classes Alternatively

Slide 86

Slide 86 text

OO Perl with Moose ● Moose is also extensible

Slide 87

Slide 87 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects

Slide 88

Slide 88 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects ● This is where the wizards roam free

Slide 89

Slide 89 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects ● This is where the wizards roam free ● A lot of extensions exist in the MooseX:: namespace

Slide 90

Slide 90 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects ● This is where the wizards roam free ● A lot of extensions exist in the MooseX:: namespace ● New ideas usually start life here

Slide 91

Slide 91 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects ● This is where the wizards roam free ● A lot of extensions exist in the MooseX:: namespace ● New ideas usually start life here ● Good ones get incorporated into Moose

Slide 92

Slide 92 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects ● This is where the wizards roam free ● A lot of extensions exist in the MooseX:: namespace ● New ideas usually start life here ● Good ones get incorporated into Moose ● An example is MooseX::AttributeHelpers

Slide 93

Slide 93 text

OO Perl with Moose ● Moose is also extensible ● Done by manipulating metaclass objects ● This is where the wizards roam free ● A lot of extensions exist in the MooseX:: namespace ● New ideas usually start life here ● Good ones get incorporated into Moose ● An example is MooseX::AttributeHelpers ● These were incorporated in the Moose::Meta::Attribute:: Native namespace

Slide 94

Slide 94 text

OO Perl with Moose package Person; use Moose; use namespace::clean -except => [qw( meta )]; # attributes and methods __PACKAGE__->meta->make_immutable(); 1; Lastly you will note that Moose introduces its own boiler plate code

Slide 95

Slide 95 text

OO Perl with Moose package Person; use Moose; use namespace::clean -except => [qw( meta )]; # attributes and methods __PACKAGE__->meta->make_immutable(); 1; Lastly you will note that Moose introduces its own boiler plate code There is an extension that reduces this

Slide 96

Slide 96 text

OO Perl with Moose package Person; use Moose; use namespace::clean -except => [qw( meta )]; # attributes and methods __PACKAGE__->meta->make_immutable(); 1; Lastly you will note that Moose introduces its own boiler plate code There is an extension that reduces this MooseX::Declare

Slide 97

Slide 97 text

OO Perl with Moose use MooseX::Declare; class Person { # attributes and methods } Declaring classes becomes even more declarative

Slide 98

Slide 98 text

OO Perl with Moose use MooseX::Declare; class Person { # attributes and methods } Combines the power of Moose with Devel::Declare to produce keywords for Perl 5 written in Perl 5

Slide 99

Slide 99 text

OO Perl with Moose use MooseX::Declare; class Person { # attributes and methods method research() { ... } } Combines the power of Moose with Devel::Declare to produce keywords for Perl 5 written in Perl 5 Keywords include class, role, method

Slide 100

Slide 100 text

OO Perl with Moose use MooseX::Declare; class Person { # attributes and methods method research() { ... } } Combines the power of Moose with Devel::Declare to produce keywords for Perl 5 written in Perl 5 Keywords include class, role, method Note that the methods have signatures complete with type checking

Slide 101

Slide 101 text

OO Perl with Moose use MooseX::Declare; class Person { # attributes and methods method research() { ... } } Combines the power of Moose with Devel::Declare to produce keywords for Perl 5 written in Perl 5 Keywords include class, role, method Note that the methods have signatures complete with type checking So using MooseX::Declare the Scientist class example could look like the following:

Slide 102

Slide 102 text

OO Perl with Moose use MooseX::Declare; class Scientist extends Person with Science { use Duration; # fictional class one could write has 'funding' => ( is => 'rw', isa => 'Num', lazy_build => 1, ); method research( Duration $contract_duration ) { unless ( $self->has_funding ) { confess 'need funding to work'; } while ( not $contract_duration->expired ) { # do your research ... } } }

Slide 103

Slide 103 text

Thank you Questions?