From 1bb542877f273df8da63d27f309a275fe1123eb9 Mon Sep 17 00:00:00 2001 From: Dave Cross Date: Sat, 7 Mar 2015 16:54:12 +0000 Subject: [PATCH] Sample code for the introduction to Moose. --- code/Person.pm | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ code/person | 18 ++++++++++++++++++ code/person1 | 16 ++++++++++++++++ code/person2 | 20 ++++++++++++++++++++ code/person3 | 13 +++++++++++++ code/person4 | 13 +++++++++++++ code/person5 | 13 +++++++++++++ 7 files changed, 143 insertions(+) create mode 100644 code/Person.pm create mode 100755 code/person create mode 100755 code/person1 create mode 100755 code/person2 create mode 100755 code/person3 create mode 100755 code/person4 create mode 100755 code/person5 diff --git a/code/Person.pm b/code/Person.pm new file mode 100644 index 0000000..dfce414 --- /dev/null +++ b/code/Person.pm @@ -0,0 +1,50 @@ +package Person; +use Moose; +use Moose::Util::TypeConstraints; +use DateTime; +use DateTime::Format::Strptime; + +subtype 'BirthDate', + as 'DateTime'; + +coerce 'BirthDate', + from 'Str', + via { + return DateTime::Format::Strptime->new( + pattern => '%Y-%m-%d', + )->parse_datetime($_); + }; + +subtype 'Gender', + as 'Str', + where { /^[FM]$/ }, + message { "$_ is not a valid gender. It should be F or M" }; + +has name => ( + isa => 'Str', + is => 'rw', + required => 1, +); + +has dob => ( + isa => 'BirthDate', + is => 'ro', + required => 1, + coerce => 1, +); + +has gender => ( + isa => 'Gender', + is => 'rw', + required => 1, +); + +sub age { + my $self = shift; + + my $duration = DateTime->now - $self->dob; + + return $duration->years; +} + +1; diff --git a/code/person b/code/person new file mode 100755 index 0000000..36bf1e8 --- /dev/null +++ b/code/person @@ -0,0 +1,18 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.010; +use DateTime; +use Person; + +my $newborn = Person->new( + name => 'Miles', + dob => DateTime->now, + gender => 'M' +); + +say $newborn->name; # displays 'Miles' +say $newborn->dob; # displays current date +$newborn->name('Max'); # Parents change their minds +say $newborn->name; # displays 'Max' +say $newborn->dob->day_name; diff --git a/code/person1 b/code/person1 new file mode 100755 index 0000000..720b5b3 --- /dev/null +++ b/code/person1 @@ -0,0 +1,16 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.010; +use DateTime; +use Person; + +my $dob = DateTime->new(year => 1962, month => 9, day => 7); + +my $dave = Person->new( + name => 'Dave', + dob => $dob, + gender => 'M' +); + +say $dave->dob->day_name; diff --git a/code/person2 b/code/person2 new file mode 100755 index 0000000..e1a5627 --- /dev/null +++ b/code/person2 @@ -0,0 +1,20 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.010; +use DateTime::Format::Strptime; +use Person; + +my $date_parser = DateTime::Format::Strptime->new( + pattern => '%Y-%m-%d', +); + +my $dob = $date_parser->parse_datetime('1962-09-07'); + +my $dave = Person->new( + name => 'Dave', + dob => $dob, + gender => 'M' +); + +say $dave->dob->day_name; diff --git a/code/person3 b/code/person3 new file mode 100755 index 0000000..b76c60c --- /dev/null +++ b/code/person3 @@ -0,0 +1,13 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.010; +use Person; + +my $dave = Person->new( + name => 'Dave', + dob => '1962-09-07', + gender => 'M' +); + +say $dave->dob->day_name; diff --git a/code/person4 b/code/person4 new file mode 100755 index 0000000..f9d9f0f --- /dev/null +++ b/code/person4 @@ -0,0 +1,13 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.010; +use Person; + +my $dave = Person->new( + name => 'Dave', + dob => '1962-09-07', + gender => 'X' +); + +say $dave->dob->day_name; diff --git a/code/person5 b/code/person5 new file mode 100755 index 0000000..91db13c --- /dev/null +++ b/code/person5 @@ -0,0 +1,13 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.010; +use Person; + +my $dave = Person->new( + name => 'Dave', + dob => '1962-09-07', + gender => 'M' +); + +say $dave->age;