forked from moose/Moose
-
Notifications
You must be signed in to change notification settings - Fork 2
/
immutable.pl
100 lines (79 loc) · 2.29 KB
/
immutable.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/perl
use strict;
use warnings;
use Scalar::Util 'blessed';
use Benchmark qw[cmpthese];
use Moose::Util::TypeConstraints;
{
package Foo;
use Moose;
Foo->meta->make_immutable(debug => 0);
}
coerce 'Foo'
=> from 'ArrayRef'
=> via { Foo->new(@{$_}) };
{
package Foo::Normal;
use Moose;
has 'default' => (is => 'rw', default => 10);
has 'default_sub' => (is => 'rw', default => sub { [] });
has 'lazy' => (is => 'rw', default => 10, lazy => 1);
has 'required' => (is => 'rw', required => 1);
has 'weak_ref' => (is => 'rw', weak_ref => 1);
has 'type_constraint' => (is => 'rw', isa => 'Foo');
has 'coercion' => (is => 'rw', isa => 'Foo', coerce => 1);
package Bar::Normal;
use Moose;
extends 'Foo::Normal';
has 'default_w_type_constraint' => (
is => 'rw',
isa => 'Int',
default => 10,
);
}
{
package Foo::Immutable;
use Moose;
has 'default' => (is => 'rw', default => 10);
has 'default_sub' => (is => 'rw', default => sub { [] });
has 'lazy' => (is => 'rw', default => 10, lazy => 1);
has 'required' => (is => 'rw', required => 1);
has 'weak_ref' => (is => 'rw', weak_ref => 1);
has 'type_constraint' => (is => 'rw', isa => 'Foo');
has 'coercion' => (is => 'rw', isa => 'Foo', coerce => 1);
#sub BUILD {
# # ...
#}
Foo::Immutable->meta->make_immutable(debug => 0);
package Bar::Immutable;
use Moose;
extends 'Foo::Immutable';
has 'default_w_type_constraint' => (
is => 'rw',
isa => 'Int',
default => 10,
);
Bar::Immutable->meta->make_immutable(debug => 0);
}
#__END__
my $foo = Foo->new;
cmpthese(10_000,
{
'normal' => sub {
Foo::Normal->new(
required => 'BAR',
type_constraint => $foo,
coercion => [],
weak_ref => {},
);
},
'immutable' => sub {
Foo::Immutable->new(
required => 'BAR',
type_constraint => $foo,
coercion => [],
weak_ref => {},
);
},
}
);