oo perl with moose
TRANSCRIPT
![Page 1: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/1.jpg)
OO Perl with Moose
Nelo Onyiah
![Page 2: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/2.jpg)
OO Perl with Moose
What is Moose?
![Page 3: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/3.jpg)
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.
![Page 4: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/4.jpg)
OO Perl with Moose
Why Moose?
![Page 5: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/5.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerful
![Page 6: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/6.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerfuldefine your class declaratively
![Page 7: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/7.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerfuldefine your class declarativelyoffers "sugar" for object construction, attributes, e.t.c
![Page 8: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/8.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerfuldefine your class declarativelyoffers "sugar" for object construction, attributes, e.t.cdon't need to care how they are implemented
![Page 9: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/9.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerfuldefine your class declarativelyoffers "sugar" for object construction, attributes, e.t.cdon't need to care how they are implementedconcentrate on the logical structure of your classes
![Page 10: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/10.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerfuldefine your class declarativelyoffers "sugar" for object construction, attributes, e.t.cdon't need to care how they are implementedconcentrate on the logical structure of your classesdon't need to be a wizard to use it
![Page 11: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/11.jpg)
OO Perl with Moose
Why Moose?
makes Perl 5 OO both simpler and more powerfuldefine your class declarativelyoffers "sugar" for object construction, attributes, e.t.cdon't need to care how they are implementedconcentrate on the logical structure of your classesdon't need to be a wizard to use it but if you are, lets you dig about in the guts and extend it
![Page 12: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/12.jpg)
OO Perl with Moose
package Person;1;
To make a class you start with a package
![Page 13: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/13.jpg)
OO Perl with Moose
package Person;use Moose;
1;
To make a class you start with a package and just use Moose
![Page 14: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/14.jpg)
OO Perl with Moose
package Person;use Moose;
1;
This is a complete class definition
![Page 15: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/15.jpg)
OO Perl with Moose
package Person;use Moose;
1;
This is a complete class definition
not terribly useful though
![Page 16: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/16.jpg)
OO Perl with Moose
package Person;use Moose;
1;
Under the hood Moose is doing a lot
![Page 17: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/17.jpg)
OO Perl with Moose
package Person;use Moose;
1;
Under the hood Moose is doing a lot
(won't go into that though)
![Page 18: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/18.jpg)
OO Perl with Moose
package Person;use Moose;
1;
Classes have zero or more attributes
![Page 19: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/19.jpg)
OO Perl with Moose
package Person;use Moose; has 'birth_date' => (); 1;
Attributes are declared using the has function
![Page 20: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/20.jpg)
OO Perl with Moose
package Person;use Moose; has 'birth_date' => (); 1;
Attributes are declared using the has function
Attributes have properties
![Page 21: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/21.jpg)
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
![Page 22: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/22.jpg)
OO Perl with Moose
package Person;use Moose; has 'birth_date' => (); 1;
Can be provided with accessors
![Page 23: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/23.jpg)
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
![Page 24: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/24.jpg)
OO Perl with Moose
package Person;use Moose; has 'birth_date' => ( is => 'ro', ); 1;
or read-only
![Page 25: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/25.jpg)
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
![Page 26: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/26.jpg)
OO Perl with Moose
package Person;use Moose; has 'birth_date' => ( is => 'ro', isa => 'Str', ); 1;
You can specify a type for your attribute
![Page 27: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/27.jpg)
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
![Page 28: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/28.jpg)
OO Perl with Moose
package Person;use Moose; has 'birth_date' => ( is => 'ro', isa => 'Str', ); 1;
Built in types include:StrNumArrayRefCodeRefAnymore ...
![Page 29: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/29.jpg)
OO Perl with Moose
package Person;use Moose;use DateTime;
has 'birth_date' => ( is => 'ro', isa => 'DateTime', ); 1;
Class names are treated as types
![Page 30: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/30.jpg)
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
![Page 31: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/31.jpg)
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
![Page 32: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/32.jpg)
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
![Page 33: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/33.jpg)
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
![Page 34: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/34.jpg)
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
![Page 35: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/35.jpg)
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
![Page 36: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/36.jpg)
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
![Page 37: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/37.jpg)
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
![Page 38: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/38.jpg)
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
![Page 39: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/39.jpg)
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
![Page 40: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/40.jpg)
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
![Page 41: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/41.jpg)
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
![Page 42: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/42.jpg)
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
![Page 43: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/43.jpg)
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
![Page 44: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/44.jpg)
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
![Page 45: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/45.jpg)
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
![Page 46: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/46.jpg)
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
![Page 47: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/47.jpg)
OO Perl with Moose
package Employee;use Moose;extends qw( Person ); 1;
Inheritance is achieved with the extends function
![Page 48: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/48.jpg)
OO Perl with Moose
package Employee;use Moose;extends qw( Person ); 1;
Inheritance is achieved with the extends function
Moose supports multiple inheritance
![Page 49: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/49.jpg)
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
![Page 50: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/50.jpg)
OO Perl with Moose
package Employee;use Moose;extends qw( Person ); override '_build_birth_date' => sub { # ... }1;
Override parent methods with the override function
![Page 51: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/51.jpg)
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
![Page 52: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/52.jpg)
OO Perl with Moose
package Employee;use Moose;extends qw( Person ); has '+birth_date' => ( # ... );1;
You can also override attributes
![Page 53: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/53.jpg)
OO Perl with Moose
package Employee;use Moose;extends qw( Person ); has '+birth_date' => ( # ... );1;
You can also override attributes (carefully)
![Page 54: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/54.jpg)
OO Perl with Moose
package Science; 1;
Moose also has a concept of roles
![Page 55: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/55.jpg)
OO Perl with Moose
package Science;use Moose::Role; 1;
Moose also has a concept of roles
Declared by using Moose::Role
![Page 56: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/56.jpg)
OO Perl with Moose
package Science;use Moose::Role; 1;
Similar to Smalltalk traits, Ruby Mixins and Java interfaces
![Page 57: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/57.jpg)
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
![Page 58: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/58.jpg)
OO Perl with Moose
package Science;use Moose::Role; 1;
A collection of reusable traits (attributes)
![Page 59: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/59.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... );1;
A collection of reusable traits (attributes)
![Page 60: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/60.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
A collection of reusable traits (attributes) and behaviour (methods)
![Page 61: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/61.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
Roles are not classes
![Page 62: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/62.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
Roles are not classes
cannot instantiate a role
![Page 63: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/63.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
Roles are not classes
cannot instantiate a rolecannot inherit from a role
![Page 64: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/64.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
Roles are another option to inheritance
![Page 65: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/65.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
Roles are composed into consuming classes/roles
![Page 66: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/66.jpg)
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
![Page 67: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/67.jpg)
OO Perl with Moose
package Science;use Moose::Role; has 'speciality' => ( # ... ); sub research { # ...}1;
Roles can insist that consuming classes implement certain methods
![Page 68: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/68.jpg)
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
![Page 69: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/69.jpg)
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
![Page 70: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/70.jpg)
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
![Page 71: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/71.jpg)
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
![Page 72: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/72.jpg)
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
![Page 73: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/73.jpg)
OO Perl with Moose
package Scientist;use Moose;extends qw( Person );with qw( Science ); sub research { ... }1;
Class methods and attributes are prioritized
![Page 74: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/74.jpg)
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
![Page 75: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/75.jpg)
OO Perl with Moose
package Scientist;use Moose;extends qw( Person );with qw( Science ); sub research { ... }1;
See Moose::Manual::Roles for details
![Page 76: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/76.jpg)
OO Perl with Moose
package Scientist;use Moose;extends qw( Person );with qw( Science ); sub research { ... }1;
Moose is not perfect
![Page 77: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/77.jpg)
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
![Page 78: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/78.jpg)
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
![Page 79: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/79.jpg)
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
![Page 80: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/80.jpg)
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
![Page 81: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/81.jpg)
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
![Page 82: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/82.jpg)
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
![Page 83: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/83.jpg)
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
![Page 84: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/84.jpg)
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
![Page 85: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/85.jpg)
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
![Page 86: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/86.jpg)
OO Perl with Moose
Moose is also extensible
![Page 87: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/87.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects
![Page 88: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/88.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects This is where the wizards roam free
![Page 89: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/89.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects This is where the wizards roam free A lot of extensions exist in the MooseX:: namespace
![Page 90: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/90.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects This is where the wizards roam free A lot of extensions exist in the MooseX:: namespaceNew ideas usually start life here
![Page 91: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/91.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects This is where the wizards roam free A lot of extensions exist in the MooseX:: namespaceNew ideas usually start life here Good ones get incorporated into Moose
![Page 92: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/92.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects This is where the wizards roam free A lot of extensions exist in the MooseX:: namespaceNew ideas usually start life here Good ones get incorporated into MooseAn example is MooseX::AttributeHelpers
![Page 93: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/93.jpg)
OO Perl with Moose
Moose is also extensibleDone by manipulating metaclass objects This is where the wizards roam free A lot of extensions exist in the MooseX:: namespaceNew ideas usually start life here Good ones get incorporated into MooseAn example is MooseX::AttributeHelpersThese were incorporated in the Moose::Meta::Attribute::Native namespace
![Page 94: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/94.jpg)
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
![Page 95: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/95.jpg)
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
![Page 96: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/96.jpg)
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
![Page 97: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/97.jpg)
OO Perl with Moose
use MooseX::Declare; class Person { # attributes and methods }
Declaring classes becomes even more declarative
![Page 98: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/98.jpg)
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
![Page 99: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/99.jpg)
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
![Page 100: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/100.jpg)
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
![Page 101: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/101.jpg)
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:
![Page 102: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/102.jpg)
OO Perl with Mooseuse 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 ... } } }
![Page 103: OO Perl with Moose](https://reader034.vdocument.in/reader034/viewer/2022042518/554f833cb4c9052a518b4dd3/html5/thumbnails/103.jpg)
Thank you
Questions?