SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
Moose Design
                               Patterns
                Ynon Perek
                ynonperek@yahoo.com
                http://ynonperek.com




Tuesday, February 28, 2012
Good Code   Bad Code




Tuesday, February 28, 2012
OOP Use Cases

                    • Write code that other developers
                             will use
                    • Write code that will survive in an ever
                             changing environment




Tuesday, February 28, 2012
Meet The Moose
Tuesday, February 28, 2012
Moose

                    • Post Modern Object Oriented Perl
                    • Consistent OO Framework
                    • Stable


Tuesday, February 28, 2012
A First Class
                                                                                Class Def
                                                         package Person;


                    •
                                                         use Moose;
                             A class is just a package
                                                         has 'name', is => 'ro', isa => 'Str';
                                                         has 'age', is => 'rw', isa => 'Int';

                    •        A method is just a sub

                    •        An attribute is ...
                                                                                Class Use
                             We’ll get to that later     package main;
                                                         use feature ':5.10';

                                                         my $p = Person->new(name => "James");
                                                         say $p->name;




Tuesday, February 28, 2012
Object Methods
           package Car;
           use Moose;

           has 'speed', is => 'ro';              •   A method takes
                                                     the object
           sub go {
               my $self = shift;                     (invocant) as its
               print   "Vroom Vroom [speed: ",       first argument
                       $self->speed,
                       "]n";
           }
                                                 •   That’s why we use
           package main;                             my $self = shift
           my $c = Car->new(speed => 10);
           $c->go;




Tuesday, February 28, 2012
Whats In The Box


            •      A new method

            •      use strict, use warnings

            •      Type Validation

            •      Organize Your Code




Tuesday, February 28, 2012
OO Design
Tuesday, February 28, 2012
OO Design
                   Patterns
               Tested, Proven development
                paradigms for speeding up
                  development process




Tuesday, February 28, 2012
Pattern Structure

                    • Name
                    • Problem
                    • Solution
                    • Consequences

Tuesday, February 28, 2012
Categories
           Creational          Behavioral    Structural

            Singleton         Observer      Mixins
                              Template
            Factory
                              Method        Composite
             Builder
                               Flyweight



Tuesday, February 28, 2012
Creational Patterns
                    • Abstract instantiation process
                    • We must only create one log file instance
                             for the entire system
                    • An XML tree is built gradually,
                             node-by-node




Tuesday, February 28, 2012
Singleton Pattern

                    • Ensure a class only has one instance
                    • Manage Resource Sharing


Tuesday, February 28, 2012
Moose Singleton
           package Logger;
           use MooseX::Singleton;

           sub debug { ... }
           sub warn { ... }

           package main;

           my $logger         = Logger->instance;
           my $same           = Logger->instance;

           my $and_again      = Logger->new;

           $logger->debug("Hello World");




Tuesday, February 28, 2012
Factory
                    • Create a different object based
                             on some conditional
                    • Treat the newly created objects
                             the same way
                    • Practical: abstract away OS related code

Tuesday, February 28, 2012
Factory
           package AppConfig;
           use Moose::Role;

           requires 'debug_mode';          •   Use a Role to
           requires 'native_separators';
                                               specify common
           requires 'root_fs';                 behavior




Tuesday, February 28, 2012
Factory
     package ConfigFactory;
     use Moose;

     sub build_config {
         my $cfg;                                    •   All creation logic
         given ($^O) {                                   stays in the
             $cfg = WinConfig->new when /MSWin32/;
             $cfg = UnixConfig->new;
                                                         factory
         }
         return $cfg;
     }




Tuesday, February 28, 2012
Factory

         package main;                            •   Users only need
                                                      to know about
         my $cfg = ConfigFactory->build_config;
                                                      the role, not the
         say $cfg->debug_mode;                        various
                                                      implementations




Tuesday, February 28, 2012
Creational Patterns




Tuesday, February 28, 2012
Behavioral Patterns

                    • Assignment of responsibility
                             between objects and classes
                    • Use either inheritance or composition


Tuesday, February 28, 2012
Template Methods
Tuesday, February 28, 2012
Template Method

                    • Separate the algorithm from the actual
                             implementation
                    • Define the skeleton of an algorithm
                    • Example: Paint on a canvas or printer


Tuesday, February 28, 2012
Painter Example
                                Draw Pixel




Tuesday, February 28, 2012
Roles: Partials
                                                       package Painter;

                    •        Template methods are      use Moose::Role;

                             implemented using roles   requires 'drawPixel';


                    •        Use requires to define a   sub draw_line      { ... }
                                                       sub draw_triangle { ... }
                             partial implementation    sub draw_rectangle { ... }




Tuesday, February 28, 2012
Roles: Partials
                  package ScreenPainter;
                  use Moose;

                  with 'Painter';

                  sub draw_pixel { ... }

                  package main;
                  my $painter = ScreenPainter->new;

                  $painter->draw_line(0, 0, 100, 100);




Tuesday, February 28, 2012
Behavioral Patterns




Tuesday, February 28, 2012
Structural

                    • Control structure of an object
                    • Is it composed of other objects ?
                    • How are these parts used ?
                    • Composition, Decorator, Adapter

Tuesday, February 28, 2012
Composition: What

                 Send Mail                  Send Mail
                                  Contact               Email
               Call
                                                 Call

                                                        Phone




Tuesday, February 28, 2012
Moose Composition

                    • Moose has a built-in support for delegation
                    • Use handles on an attribute to create an
                             effective composition
                    • Prefer composition over inheritance


Tuesday, February 28, 2012
Delegation: How
                                                    package Contact;

                  •     Can take regular            use Moose;

                        expressions                 has 'email' => (
                                                        is      => 'ro',
                  •     Can take hashref                handles => [ qw/send_mail/ ]
                                                    );

                  •     perldoc
                        Moose::Manual::Delegation   my $c = Contact->new;
                                                    $c->send_mail(subject => "Hello",
                                                                  text => "...");




Tuesday, February 28, 2012
Delegation

                    • Delegation is explicit
                    • Performed via attributes
                    • Highly recommended


Tuesday, February 28, 2012
OO Design
           Consider design patterns

           Use the power of perl

           Clean Code is worth it




Tuesday, February 28, 2012
Thanks For
                              Listening
                Ynon Perek
                ynonperek@yahoo.com
                http://ynonperek.com




Tuesday, February 28, 2012

Weitere ähnliche Inhalte

Was ist angesagt?

(Big) Data Serialization with Avro and Protobuf
(Big) Data Serialization with Avro and Protobuf(Big) Data Serialization with Avro and Protobuf
(Big) Data Serialization with Avro and Protobuf
Guido Schmutz
 

Was ist angesagt? (20)

Client-side JavaScript
Client-side JavaScriptClient-side JavaScript
Client-side JavaScript
 
A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages! ...
A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages! ...A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages! ...
A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages! ...
 
Understanding Active Directory Enumeration
Understanding Active Directory EnumerationUnderstanding Active Directory Enumeration
Understanding Active Directory Enumeration
 
Bypass file upload restrictions
Bypass file upload restrictionsBypass file upload restrictions
Bypass file upload restrictions
 
Sql injection with sqlmap
Sql injection with sqlmapSql injection with sqlmap
Sql injection with sqlmap
 
Optimizing Cypher Queries in Neo4j
Optimizing Cypher Queries in Neo4jOptimizing Cypher Queries in Neo4j
Optimizing Cypher Queries in Neo4j
 
php
phpphp
php
 
Red Team Apocalypse (RVAsec Edition)
Red Team Apocalypse (RVAsec Edition)Red Team Apocalypse (RVAsec Edition)
Red Team Apocalypse (RVAsec Edition)
 
Pymongo password change made easy
Pymongo password change made easyPymongo password change made easy
Pymongo password change made easy
 
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo MazzaferroRESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
RESTful Machine Learning with Flask and TensorFlow Serving - Carlo Mazzaferro
 
(Big) Data Serialization with Avro and Protobuf
(Big) Data Serialization with Avro and Protobuf(Big) Data Serialization with Avro and Protobuf
(Big) Data Serialization with Avro and Protobuf
 
Php basics
Php basicsPhp basics
Php basics
 
Basic introduction to html and php tags
Basic introduction to html and php tagsBasic introduction to html and php tags
Basic introduction to html and php tags
 
Introduction to xml
Introduction to xmlIntroduction to xml
Introduction to xml
 
PHP
PHPPHP
PHP
 
Php functions
Php functionsPhp functions
Php functions
 
Php and MySQL
Php and MySQLPhp and MySQL
Php and MySQL
 
Testing web application firewalls (waf) accuracy
Testing web application firewalls (waf) accuracyTesting web application firewalls (waf) accuracy
Testing web application firewalls (waf) accuracy
 
Basics PHP
Basics PHPBasics PHP
Basics PHP
 
Memento css
Memento cssMemento css
Memento css
 

Ähnlich wie Moose Design Patterns

Flexible heterogenous replication
Flexible heterogenous replicationFlexible heterogenous replication
Flexible heterogenous replication
Jeff Mace
 
7th math c2 -l28--nov6
7th math c2 -l28--nov67th math c2 -l28--nov6
7th math c2 -l28--nov6
jdurst65
 

Ähnlich wie Moose Design Patterns (18)

Flexible heterogenous replication
Flexible heterogenous replicationFlexible heterogenous replication
Flexible heterogenous replication
 
Engines Lightning Talk
Engines Lightning TalkEngines Lightning Talk
Engines Lightning Talk
 
Mansoura University CSED & Nozom web development sprint
Mansoura University CSED & Nozom web development sprintMansoura University CSED & Nozom web development sprint
Mansoura University CSED & Nozom web development sprint
 
Brubeck: Overview
Brubeck: OverviewBrubeck: Overview
Brubeck: Overview
 
Disconnecting the Database with ActiveRecord
Disconnecting the Database with ActiveRecordDisconnecting the Database with ActiveRecord
Disconnecting the Database with ActiveRecord
 
Overview of Backbone
Overview of BackboneOverview of Backbone
Overview of Backbone
 
Brief overview of NoSQL & MongoDB for GTUG Tbilisi Event
Brief overview of NoSQL & MongoDB for GTUG Tbilisi EventBrief overview of NoSQL & MongoDB for GTUG Tbilisi Event
Brief overview of NoSQL & MongoDB for GTUG Tbilisi Event
 
7th math c2 -l28--nov6
7th math c2 -l28--nov67th math c2 -l28--nov6
7th math c2 -l28--nov6
 
Big Data Step-by-Step: Infrastructure 2/3: Running R and RStudio on EC2
Big Data Step-by-Step: Infrastructure 2/3: Running R and RStudio on EC2Big Data Step-by-Step: Infrastructure 2/3: Running R and RStudio on EC2
Big Data Step-by-Step: Infrastructure 2/3: Running R and RStudio on EC2
 
Getting started with Windows Phone 7 and unit test
Getting started with Windows Phone 7 and unit testGetting started with Windows Phone 7 and unit test
Getting started with Windows Phone 7 and unit test
 
Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013
 
Scalable JavaScript
Scalable JavaScriptScalable JavaScript
Scalable JavaScript
 
Socal piggies-app-deploy
Socal piggies-app-deploySocal piggies-app-deploy
Socal piggies-app-deploy
 
The state of drupal 8 - Drupalcamp Gent
The state of drupal 8  - Drupalcamp GentThe state of drupal 8  - Drupalcamp Gent
The state of drupal 8 - Drupalcamp Gent
 
developing sysadmin, sysadmining developersGuug devops puppet
developing sysadmin, sysadmining developersGuug devops puppetdeveloping sysadmin, sysadmining developersGuug devops puppet
developing sysadmin, sysadmining developersGuug devops puppet
 
D7 as D8
D7 as D8D7 as D8
D7 as D8
 
Como escalar aplicações PHP
Como escalar aplicações PHPComo escalar aplicações PHP
Como escalar aplicações PHP
 
Eero cocoaheadssf-talk
Eero cocoaheadssf-talkEero cocoaheadssf-talk
Eero cocoaheadssf-talk
 

Mehr von Ynon Perek

Mobile Devices
Mobile DevicesMobile Devices
Mobile Devices
Ynon Perek
 

Mehr von Ynon Perek (20)

Regexp
RegexpRegexp
Regexp
 
Html5 intro
Html5 introHtml5 intro
Html5 intro
 
09 performance
09 performance09 performance
09 performance
 
Mobile Web Intro
Mobile Web IntroMobile Web Intro
Mobile Web Intro
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
 
Vimperl
VimperlVimperl
Vimperl
 
Syllabus
SyllabusSyllabus
Syllabus
 
Mobile Devices
Mobile DevicesMobile Devices
Mobile Devices
 
Network
NetworkNetwork
Network
 
Architecture app
Architecture appArchitecture app
Architecture app
 
Cryptography
CryptographyCryptography
Cryptography
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript Applications
 
How to write easy-to-test JavaScript
How to write easy-to-test JavaScriptHow to write easy-to-test JavaScript
How to write easy-to-test JavaScript
 
Introduction to Selenium and Ruby
Introduction to Selenium and RubyIntroduction to Selenium and Ruby
Introduction to Selenium and Ruby
 
Introduction To Web Application Testing
Introduction To Web Application TestingIntroduction To Web Application Testing
Introduction To Web Application Testing
 
Accessibility
AccessibilityAccessibility
Accessibility
 
Angularjs
AngularjsAngularjs
Angularjs
 
Js memory
Js memoryJs memory
Js memory
 
Qt Design Patterns
Qt Design PatternsQt Design Patterns
Qt Design Patterns
 
Web Application Security
Web Application SecurityWeb Application Security
Web Application Security
 

Kürzlich hochgeladen

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Kürzlich hochgeladen (20)

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 

Moose Design Patterns

  • 1. Moose Design Patterns Ynon Perek ynonperek@yahoo.com http://ynonperek.com Tuesday, February 28, 2012
  • 2. Good Code Bad Code Tuesday, February 28, 2012
  • 3. OOP Use Cases • Write code that other developers will use • Write code that will survive in an ever changing environment Tuesday, February 28, 2012
  • 4. Meet The Moose Tuesday, February 28, 2012
  • 5. Moose • Post Modern Object Oriented Perl • Consistent OO Framework • Stable Tuesday, February 28, 2012
  • 6. A First Class Class Def package Person; • use Moose; A class is just a package has 'name', is => 'ro', isa => 'Str'; has 'age', is => 'rw', isa => 'Int'; • A method is just a sub • An attribute is ... Class Use We’ll get to that later package main; use feature ':5.10'; my $p = Person->new(name => "James"); say $p->name; Tuesday, February 28, 2012
  • 7. Object Methods package Car; use Moose; has 'speed', is => 'ro'; • A method takes the object sub go {     my $self = shift; (invocant) as its     print "Vroom Vroom [speed: ", first argument             $self->speed,             "]n"; } • That’s why we use package main; my $self = shift my $c = Car->new(speed => 10); $c->go; Tuesday, February 28, 2012
  • 8. Whats In The Box • A new method • use strict, use warnings • Type Validation • Organize Your Code Tuesday, February 28, 2012
  • 10. OO Design Patterns Tested, Proven development paradigms for speeding up development process Tuesday, February 28, 2012
  • 11. Pattern Structure • Name • Problem • Solution • Consequences Tuesday, February 28, 2012
  • 12. Categories Creational Behavioral Structural Singleton Observer Mixins Template Factory Method Composite Builder Flyweight Tuesday, February 28, 2012
  • 13. Creational Patterns • Abstract instantiation process • We must only create one log file instance for the entire system • An XML tree is built gradually, node-by-node Tuesday, February 28, 2012
  • 14. Singleton Pattern • Ensure a class only has one instance • Manage Resource Sharing Tuesday, February 28, 2012
  • 15. Moose Singleton package Logger; use MooseX::Singleton; sub debug { ... } sub warn { ... } package main; my $logger = Logger->instance; my $same = Logger->instance; my $and_again = Logger->new; $logger->debug("Hello World"); Tuesday, February 28, 2012
  • 16. Factory • Create a different object based on some conditional • Treat the newly created objects the same way • Practical: abstract away OS related code Tuesday, February 28, 2012
  • 17. Factory package AppConfig; use Moose::Role; requires 'debug_mode'; • Use a Role to requires 'native_separators'; specify common requires 'root_fs'; behavior Tuesday, February 28, 2012
  • 18. Factory package ConfigFactory; use Moose; sub build_config {     my $cfg; • All creation logic     given ($^O) { stays in the         $cfg = WinConfig->new when /MSWin32/;         $cfg = UnixConfig->new; factory     }     return $cfg; } Tuesday, February 28, 2012
  • 19. Factory package main; • Users only need to know about my $cfg = ConfigFactory->build_config; the role, not the say $cfg->debug_mode; various implementations Tuesday, February 28, 2012
  • 21. Behavioral Patterns • Assignment of responsibility between objects and classes • Use either inheritance or composition Tuesday, February 28, 2012
  • 23. Template Method • Separate the algorithm from the actual implementation • Define the skeleton of an algorithm • Example: Paint on a canvas or printer Tuesday, February 28, 2012
  • 24. Painter Example Draw Pixel Tuesday, February 28, 2012
  • 25. Roles: Partials package Painter; • Template methods are use Moose::Role; implemented using roles requires 'drawPixel'; • Use requires to define a sub draw_line { ... } sub draw_triangle { ... } partial implementation sub draw_rectangle { ... } Tuesday, February 28, 2012
  • 26. Roles: Partials package ScreenPainter; use Moose; with 'Painter'; sub draw_pixel { ... } package main; my $painter = ScreenPainter->new; $painter->draw_line(0, 0, 100, 100); Tuesday, February 28, 2012
  • 28. Structural • Control structure of an object • Is it composed of other objects ? • How are these parts used ? • Composition, Decorator, Adapter Tuesday, February 28, 2012
  • 29. Composition: What Send Mail Send Mail Contact Email Call Call Phone Tuesday, February 28, 2012
  • 30. Moose Composition • Moose has a built-in support for delegation • Use handles on an attribute to create an effective composition • Prefer composition over inheritance Tuesday, February 28, 2012
  • 31. Delegation: How package Contact; • Can take regular use Moose; expressions has 'email' => (     is => 'ro', • Can take hashref     handles => [ qw/send_mail/ ] ); • perldoc Moose::Manual::Delegation my $c = Contact->new; $c->send_mail(subject => "Hello",               text => "..."); Tuesday, February 28, 2012
  • 32. Delegation • Delegation is explicit • Performed via attributes • Highly recommended Tuesday, February 28, 2012
  • 33. OO Design Consider design patterns Use the power of perl Clean Code is worth it Tuesday, February 28, 2012
  • 34. Thanks For Listening Ynon Perek ynonperek@yahoo.com http://ynonperek.com Tuesday, February 28, 2012