Moose Best Practices
-
Upload
aran-deltac -
Category
Technology
-
view
5.124 -
download
2
description
Transcript of Moose Best Practices
MooseBest Practices
by Aran Deltac (CPAN: bluefeet)
make_immutable()
package MyClass;use Moose;
…
__PACKAGE__->meta->make_immutable;1;
default => $value
has ‘is_clean’ => ( is => ‘ro’, isa => ‘Bool’, default => 1,);
Many Possible Stateshas ‘ages’ => ( is => ‘rw’, isa => ‘ArrayRef’,);
sub avg_age { my ($self) = @_; my $ages = $self->ages(); return (sum @$ages ) / scalar @$ages;}
Possible States:• undef• []• [ … ]
if (defined($ages) and @$ages) { … }
Many Possible Stateshas ‘ages’ => ( is => ‘rw’, isa => ‘ArrayRef’, default => sub{ [] },);
sub avg_age { my ($self) = @_; my $ages = $self->ages(); return (sum @$ages ) / scalar @$ages;}
Possible Values:• undef• []• [ … ]
if (@$ages) { … }
required => 1
has ‘ssn’ => ( is => ‘ro’, isa => ‘Str’, required => 1,);
Many Possible Statessubtype ‘NonEmptyArrayRef' => as ‘ArrayRef’ => where { @$_ > 0 };
has ‘ages’ => ( is => ‘rw’, isa => ‘NonEmptyArrayRef’, required => 1,);
sub avg_age { my ($self) = @_; my $ages = $self->ages(); return (sum @$ages ) / scalar @$ages;}
Possible Values:• undef• []• [ … ]
…
builder => $sub_name
has ‘dbh’ => ( is => ‘ro’, isa => ‘dbh’, builder => ‘_build_dbh’,);sub _build_dbh { return DBI->connect(…);}
lazy => $bool
has ‘dbh’ => ( is => ‘ro’, isa => ‘dbh’, builder => ‘_build_dbh’, lazy => 1,);sub _build_dbh { return DBI->connect(…);}
lazy_build => 1
has ‘dbh’ => ( is => ‘ro’, isa => ‘DBI::db’, lazy_build => 1,);
sub _build_dbh { return DBI->connect( … );}
is => ‘ro’
has ‘name’ => ( is => ‘ro’, isa => ‘Str’,);
Changing Statehas ‘ages’ => ( is => ‘rw’, isa => ‘ArrayRef’, default => sub{ [] },);
has ‘avg_age’ => ( is => ‘ro’, isa => ‘Int’, lazy_build => 1,);sub _build_avg_age { my ($self) = @_; my $ages = $self->ages(); return (sum @$ages ) / scalar @$ages;}
my $obj = Class->new( ages => [4, 7],);
print $obj->avg_age(); # 6
$obj->ages([4, 11]);
print $obj->avg_age(); # 6!
Changing Statehas ‘ages’ => ( is => ‘ro’, isa => ‘ArrayRef’, default => sub{ [] },);
has ‘avg_age’ => ( is => ‘ro’, isa => ‘Int’, lazy_build => 1,);sub _build_avg_age { my ($self) = @_; my $ages = $self->ages(); return (sum @$ages ) / scalar @$ages;}
my $obj = Class->new( ages => [4, 7],);
print $obj->avg_age(); # 6
$obj->ages([4, 11]);
print $obj->avg_age(); # 6!
writer => $sub_name
has ‘color’ => ( is => ‘ro’, isa => ‘Str’, write => ‘_color’,);
init_arg => undef
has ‘result’ => ( is => ‘ro’, isa => ‘HashRef’, writer => ‘_set_result’, init_arg => undef,);