10. Warum Moose? package Employee; sub new { bless {} } for my $attr (qw(name title)) { no strict; *$attr = sub { my $self = shift; $self->{ $attr } = shift if @_; return $self->{ $attr }; }; }
11. Warum Moose? package Employee; sub new { bless {} } sub name { my $self = shift; $self->{name} = shift if @_; return $self->{name}; } sub title { my $self = shift; $self->{title} = shift if @_; return $self->{title}; }
12. Warum Moose? class Employee attr_accessor :name attr_accessor :title end
13. Warum Moose? package Employee; use Moose; has name => (is => 'ro'); has title => (is => 'rw');
23. Moose - Attribute package Event; use Moose; has 'name' => ( is => 'ro' ); no Moose; 1;
24. Moose - Attribute package Event; use Moose; has 'name' => ( is => 'ro' ); no Moose; 1; use Event; my $event = Event->new( name => 'FrOSCamp', ); print $event->name;
25.
26.
27. Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, );
28. Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Man muss einen Namen beim Objekterzeugen angeben!
29. Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Hierfür gibt es sowohl „getter“ als auch „setter“
30. Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Das Attribut ist eine Arrayreferenz, in der nur Strings vorkommen dürfen.
31. Moose - Attribute has name => ( is => 'ro', required => 1, ); has orga => ( is => 'rw', isa => 'ArrayRef[Str]', default => sub{ [qw/Sandro Marcus/] }, ); Falls bei der Erzeugung des Objekts keine orga angegeben wird, ist das der Standardwert
36. Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, );
37. Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, ); Ein neuer Datentyp mit Namen „TwitterMsg“
38. Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 }; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1,, ); … mit „Str“ als Basis
39. Moose – Typen use Moose::Util::TypeConstraints; subtype 'TwitterMsg' => as 'Str' => where { length $_[0] <= 140 } ; has twitter => ( is => 'rw', isa => 'ArrayRef[TwitterMsg]', auto_deref => 1, ); … und der Bedingung, dass der String kürzer als 140 Zeichen oder genau 140 Zeichen lang ist
41. Moose – Typen $event->twitter( [ 'hallo', 'welt', 'y' x 144 ], ); print "<<$_>>" for $event->twitter; Attribute (twitter) does not pass the type constraint because: Validation failed for 'ArrayRef[TwitterMsg]'
42. Moose – Typen my $event = Event->new( name => 'FrOSCamp', start_date => '17.09.2010', );
43. Moose – Typen subtype 'DateTime' => as 'Object' => where { $_[0]->isa( 'DateTime' ) }; coerce 'DateTime' => from 'Str' => via { my %info; @info{qw/day month year/} = split //, $_; DateTime->new( %info ); }; has start_date => ( is => 'rw', isa => 'DateTime', coerce => 1, );
73. Moose – Rollen package OrgaAttendee; use Moose; extends 'Attendee'; with 'Orga'; no Moose; 1;
74. Moose – Rollen package OrgaAttendee; use Moose; extends 'Attendee'; with 'Orga'; no Moose; 1; 'OrgaAttendee' verwendet Rolle 'Orga'
75. Moose – Rollen use OrgaAttendee; my $person = OrgaAttendee->new( name => 'sandro', area => 'everything', ); $person->is_responsible;
76. Moose – Rollen use Attendee; use Speaker; my $person = Attendee->new( name => 'renee' ); Speaker->meta->apply( $person ); $person->speak;
77. Moose – Rollen use Attendee; use Speaker; my $person = Attendee->new( name => 'renee' ); Speaker->meta->apply( $person ); $person->speak; Rolle 'Speaker' wird dem Objekt nachträglich zugeordnet