use 5.010; use strict; use warnings; { package M1; use Moose; has x => ( is => 'rw' ); } { package M2; use Moose; has x => ( is => 'rw' ); no Moose; __PACKAGE__->meta->make_immutable; } { package M3; use Moose; has x => ( is => 'rw', isa => 'Int' ); no Moose; __PACKAGE__->meta->make_immutable; } { package NM; sub new { my $class = shift; return bless {@_}, $class; } sub x { my $self = shift; $self->{x} = shift if @_; $self->{x}; } } use Benchmark qw( cmpthese ); cmpthese - 5, { "Moose mutable" => sub { M1->new( x => 1 ) }, "Moose immutable" => sub { M2->new( x => 1 ) }, "Moose with type check" => sub { M3->new( x => 1 ) }, "No Moose" => sub { NM->new( x => 1 ) }, };