X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=e2e889a1a72d032d6527ae0358e029615f2400dc;hb=d7deb8a91eda73a9252643bc0b221dd6e5d34482;hp=59fbfd60e9d17d21d1f1ed9eb9d32ee607843a79;hpb=7167c54d543948585d5a78983ede5fdb3cb6afc6;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 59fbfd6..e2e889a 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -40,7 +40,7 @@ img#me05 {top: 43px;left: 36px;}
-

Before & After

+

Before and After

before 'foo'
     => sub { warn 'About to call foo()' };
@@ -235,7 +246,10 @@ after  'foo'
     my @return =
         $self->$real_foo( @_, bar => 42 );
 
-    return ( @return, 'modify return values' );
+    return (
+        @return,
+        'modify return values'
+    );
 };
@@ -262,7 +276,7 @@ has weight => ( ); # kaboom -Person->new( weight => 'fat' ); +Person->new( weight => 'heavy' );
@@ -284,11 +298,11 @@ use Moose; has blog_uri => ( is => 'rw', isa => 'URI', - handles => { 'blog_hostname' => 'host' }, + handles => { 'blog_host' => 'host' }, ); -$person->blog_hostname; -# really calls $person->blog_uri->host +$person->blog_host; +# really calls $person->blog_uri->host
@@ -341,7 +355,7 @@ has blog_uri => (

Why Moose?

@@ -814,7 +828,7 @@ sub last_name {

Typo?

- $self->{last_nane} + $self->{last_nane}
@@ -829,6 +843,16 @@ has last_name => ( );
+
+

More Why Moose?

+ + +
+

Part 1: Moose Classes

@@ -866,10 +890,104 @@ use Moose;
+

BUILDARGS

+ + +
+ +
+

BUILDARGS Example

+ +
package Person;
+use Moose;
+
+sub BUILDARGS {
+    my $class = shift;
+
+    if ( @_ == 1 && ! ref $_[0] ) {
+        return { ssn => $_[0] };
+    }
+    return $class->SUPER::BUILDARGS(@_);
+}
+
+Person->new('123-45-6789')
+
+ +
+

BUILD

+ + +
+ +
+

BUILD Example

+ +
package Person;
+use Moose;
+
+sub BUILD {
+    my $self = shift;
+
+    if ( $self->country_of_residence
+         eq 'USA' ) {
+        die 'All US residents'
+            . ' must have an SSN'
+            unless $self->has_ssn;
+    }
+}
+
+ +
+

Object Construction a la Moose

+ +
Person->new(@_)
+ +
    +
  1. Calls Person->BUILDARGS(@_) to turn @_ into a hashref
  2. +
  3. Blesses a reference
  4. +
  5. Populates attributes based on the hashref from #1
  6. +
  7. Calls $new_object->BUILDALL($constructor_args) +
    ... which calls all BUILD methods
  8. +
  9. Returns the object
  10. +
+
+ +
+

The Object is Opaque

+ + +
+ +
+

DEMOLISH

+ + +
+ +

extends

package Employee;
@@ -884,14 +1002,14 @@ use Moose;
     
  • Each call to extends resets your parents
  • -

    WRONG

    +

    Wrong

    package EvilEmployee;
     use Moose;
     extends 'Person';
     extends 'Thief';
    -

    RIGHT

    +

    Right

    package EvilEmployee;
     use Moose;
    @@ -918,26 +1036,28 @@ extends 'LWP';
    -

    overrides and super

    +

    override and super

    -

    overrides and super

    +

    override and super

    package Employee;
     use Moose;
     
    -extends 'Person';
    +extends 'Person';
     
    -overrides work => sub {
    +override work => sub {
         my $self = shift;
     
    -    die "Pay me first" unless $self->got_paid;
    +    die "Pay me first"
    +        unless $self->got_paid;
         super();
     };
    @@ -949,11 +1069,12 @@ use Moose;
  • Mostly like $self->SUPER::work(@_)
  • But cannot change @_!
  • Binds the parent's method at compile time
  • +
  • Parent determined by checking Child->meta()->superclasses()
  • -

    Attributes (Part 1)

    +

    Minimal Attributes

    @@ -1009,7 +1129,7 @@ print $person->first_name; # Dave use Moose; # true -Person->can('extends'); +Person->can('extends');