1. CORRECTION: I made a mistake when discussing the attributes. I had said that the default is "read/write", and that omiting the 'is' option for an attribute would mean it is read/write. <div><br></div><div>
But by default the attribute has no accessors (which you can confirm by setting 'is' to 'bare').<div>
<br></div><div><a href="http://search.cpan.org/~drolsky/Moose-1.21/lib/Moose/Manual/Attributes.pod#Read-write_vs._read-only" target="_blank">http://search.cpan.org/~drolsky/Moose-1.21/lib/Moose/Manual/Attributes.pod#Read-write_vs._read-only</a></div>
<div><br></div><div>So:</div><div><br></div><div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">has 'val1' => ( isa => 'Str' , is => 'rw' ); # You need the 'is' if you want read-write accessors</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">has 'val2' => ( isa => 'Num' , is => 'rw' ); # You need the 'is' if you want read-write accessors</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><meta http-equiv="content-type" content="text/html; charset=utf-8"></div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div>
<div>
<br></div><div>2. In the around method modifier, the $orig argument below is a code ref:</div><div><br></div><div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">around 'to_html' => sub {</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"> my $orig = shift;</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"> my $self = shift;</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"> print "ref \$orig : " . ref( $orig ) . "\n";</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"> print '<strong>';</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"> $self->$orig;</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"> print '</strong>';</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">};</font></div></div><div><br></div><div>~ ~ ~</div><div><br></div><div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./strong-paragraph.plx </font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><p>ref $orig : CODE</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"><strong>Hello, World!</strong></p></font></div>
</div><div><br></div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div><div><br></div><div>3. I did some simple performance testing with Moose and blessed hashes. (The code will be posted at end of email).</div>
<div><br></div><div>The results show drastic differences between Moose with and without immutability and between Moose and old-style.</div><div><br></div><div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"># Moose</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./benchmark-oo.plx </font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">timethis 100000: 22 wallclock secs (22.36 usr + 0.01 sys = 22.37 CPU) @ 4470.27/s (n=100000)</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br>
</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"># Moose, immutable</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./benchmark-oo.plx </font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">timethis 100000: 2 wallclock secs ( 2.47 usr + 0.00 sys = 2.47 CPU) @ 40485.83/s (n=100000)</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br>
</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"># blessed hash</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./benchmark-old-oo.plx</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">timethis 100000: 0 wallclock secs ( 0.89 usr + 0.00 sys = 0.89 CPU) @ 112359.55/s (n=100000)</font></div></div><div><br></div><div>The methodology was crude (no hypothesis except that there might be a time difference), and I'd like to revisit this. Also, I want to know about memory as well.</div>
<div><br></div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div><div><br></div><div>4. Thanks for the info, Chris:</div><div><br></div><div><a href="http://search.cpan.org/~drolsky/Moose-1.21/lib/Moose/Meta/Attribute/Native.pm">http://search.cpan.org/~drolsky/Moose-1.21/lib/Moose/Meta/Attribute/Native.pm</a></div>
<div><br></div><div>This is certainly cleaner, and I will be using it.</div><div><br></div><div><br></div><div>Cheers,</div>
<div>Bryan</div><div><br></div><div>P.S., </div><div><br></div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div>
<div>Moose</div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div><div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">#!/usr/bin/perl</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1">package Test;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">use Moose;</font></div><div>
<font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">has 'val1' => ( isa => 'Str' , is => 'rw' );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1">has 'val2' => ( isa => 'Num' , is => 'rw' );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">package main;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">use Benchmark qw(:all) ;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">sub testMoose {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $val1 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $val2 = rand( 1000000 );</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $test = Test->new( 'val1' => $val1, 'val2' => $val2 );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> die "Wrong val" unless $val1 == $test->val1;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> die "Wrong val" unless $val2 == $test->val2;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1">}</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">timethis ( 100000, "testMoose");</font></div>
</div>
<div><br></div><div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div><div>Moose (immutable)</div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div>
</div><div><div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">#!/usr/bin/perl</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">package Test;</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">use Moose;</font></div><div>
<font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">has 'val1' => ( isa => 'Str' , is => 'rw' );</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">has 'val2' => ( isa => 'Num' , is => 'rw' );</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">no Moose;</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">__PACKAGE__->meta->make_immutable;</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">package main;</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">use Benchmark qw(:all) ;</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">sub testMoose {</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"> my $val1 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"> my $val2 = rand( 1000000 );</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br></font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace"> my $test = Test->new( 'val1' => $val1, 'val2' => $val2 );</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"> die "Wrong val" unless $val1 == $test->val1;</font></div>
<div><font class="Apple-style-span" size="1" face="'courier new', monospace">
die "Wrong val" unless $val2 == $test->val2;</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">}</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace"><br>
</font></div><div><font class="Apple-style-span" size="1" face="'courier new', monospace">timethis ( 100000, "testMoose");</font></div></div></div><div><br></div><div><div>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div><div>Non-moose</div><div>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </div></div><div><div>
<font class="Apple-style-span" face="'courier new', monospace" size="1">
#!/usr/bin/perl</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">package Test;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">sub new {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $class = shift;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $self = { _val1 => shift, _val2 => shift };</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> bless $self, $class;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> return $self;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">}</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br>
</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">sub val1 {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $self = shift;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> return $self->{ _val1 };</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">}</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">sub val2 {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $self = shift;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> return $self->{ _val2 };</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">}</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">package main;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">use Benchmark qw(:all) ;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">sub testMoose {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $val1 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $val2 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> my $test = Test->new( $val1, $val2 );</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1"> die "Wrong val" unless $val1 == $test->val1;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1"> die "Wrong val" unless $val2 == $test->val2;</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace" size="1">}</font></div><div>
<font class="Apple-style-span" face="'courier new', monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">timethis ( 100000, "testMoose");</font></div>
</div><div><br></div>
</div>