Mouse and Moose in Perl - Walking in a winter wonderland... kinda
I like Moose but I work heavily in non-persistent applications. Sadly this makes Moose's start up expense too much.
But recently I revisited Mouse (thanks to a friend). The last time I looked at it, I misread the documentation and it sounds like it was no longer being supported by the original developer. But not anymore, w00t!
The one part I really like about Mouse (and Moose) is the declarative nature of creating accessors (and therefore attributes). I really like this because it reduces the number of simple accessor tests that you need to write (saving time, tendium and kittens).
I used to use Class::Accessor but I always ran into inheritance and validation issues (which I used Params::Validate but this caused lots of custom magic for inheritance).
I think the Mouse/Moose syntax is significantly cleaner.
Compare Class::Accessor:
But recently I revisited Mouse (thanks to a friend). The last time I looked at it, I misread the documentation and it sounds like it was no longer being supported by the original developer. But not anymore, w00t!
The one part I really like about Mouse (and Moose) is the declarative nature of creating accessors (and therefore attributes). I really like this because it reduces the number of simple accessor tests that you need to write (saving time, tendium and kittens).
I used to use Class::Accessor but I always ran into inheritance and validation issues (which I used Params::Validate but this caused lots of custom magic for inheritance).
I think the Mouse/Moose syntax is significantly cleaner.
Compare Class::Accessor:
package User;
use strict;
use warnings;
use Carp;
use base qw( Class::Accessor );
__PACKAGE__->mk_accessors( qw( id username password first_name last_name ) );
# override new since I really don't like the hash ref creator and I want validation
sub new {
my $class = shift;
my $self = $class->SUPER::new;
return $self->_init( @_ );
}
# does init and validation
sub _init {
my $self = shift;
my %p = validate @_, { # wrap in sub to override in inheritance so ugly
id => 1, username => 1, first_name => 1, last_name => 1};
# init them here
}
1;vs Mouse:package User; use Mouse; # includes strict and warnings use Carp; use English qw( -no_match_vars ); has 'id' => ( is => 'ro' ); has 'username' => ( is => 'rw' ); has 'password' => ( is => 'rw' ); has 'first_name' => ( is => 'rw', isa => 'Str' ); has 'last_name' => ( is => 'rw', isa => 'Str'); no Mouse; 1;Plus the super great lazy_build option which is perfect for database handles and such.
Comments
Post a Comment