The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use 5.014;

use Benchmark 'cmpthese';

my $moose = <<'MOOSE';
package Foo::Moose::Iter%s;
use Moose;
has foo => (is => "ro");
sub bar { }
MOOSE

my $moose_immutable = <<'MOOSE';
package Foo::MooseImmutable::Iter%s;
use Moose;
has foo => (is => "ro");
sub bar { }
__PACKAGE__->meta->make_immutable;
MOOSE

my $mop = <<'MOP';
use mop;
class Foo::MOP::Iter%s {
    has $!foo is ro;
    method bar { }
}
MOP

my $raw = <<'RAW';
package Foo::Raw::Iter%s;
sub new {
    my $class = shift;
    my %%opts = @_;
    bless {
        foo => $opts{foo},
    }, $class;
}
sub foo { $_[0]->{foo} }
sub bar { }
RAW

say "Class creation";
cmpthese(-5, {
    Moose           => sub { eval sprintf $moose,           state($iter)++ },
    Moose_immutable => sub { eval sprintf $moose_immutable, state($iter)++ },
    mop             => sub { eval sprintf $mop,             state($iter)++ },
    raw             => sub { eval sprintf $raw,             state($iter)++ },
});