1. CORRECTION: I made a mistake when discussing the attributes. I had said that the default is &quot;read/write&quot;, and that omiting the &#39;is&#39; 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 &#39;is&#39; to &#39;bare&#39;).<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="&#39;courier new&#39;, monospace">has &#39;val1&#39; =&gt; ( isa =&gt; &#39;Str&#39; , is =&gt; &#39;rw&#39; ); # You need the &#39;is&#39; if you want read-write accessors</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">has &#39;val2&#39; =&gt; ( isa =&gt; &#39;Num&#39; , is =&gt; &#39;rw&#39; ); # You need the &#39;is&#39; if you want read-write accessors</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, 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="&#39;courier new&#39;, monospace">around &#39;to_html&#39; =&gt; sub {</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  my $orig = shift;</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  my $self = shift;</font></div>

<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  print &quot;ref \$orig : &quot; . ref( $orig ) . &quot;\n&quot;;</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  print &#39;&lt;strong&gt;&#39;;</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  $self-&gt;$orig;</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  print &#39;&lt;/strong&gt;&#39;;</font></div>

<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">};</font></div></div><div><br></div><div>~ ~ ~</div><div><br></div><div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./strong-paragraph.plx </font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">&lt;p&gt;ref $orig : CODE</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">&lt;strong&gt;Hello, World!&lt;/strong&gt;&lt;/p&gt;</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="&#39;courier new&#39;, monospace"># Moose</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./benchmark-oo.plx </font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, 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="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"># Moose, immutable</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">bryan@bryan-laptop:~/public_html_bryanesmith/demos/perl/oo$ ./benchmark-oo.plx </font></div>

<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, 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="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"># blessed hash</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, 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="&#39;courier new&#39;, 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&#39;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="&#39;courier new&#39;, monospace" size="1">#!/usr/bin/perl</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">package Test;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">use Moose;</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">has &#39;val1&#39; =&gt; ( isa =&gt; &#39;Str&#39; , is =&gt; &#39;rw&#39; );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">has &#39;val2&#39; =&gt; ( isa =&gt; &#39;Num&#39; , is =&gt; &#39;rw&#39; );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">package main;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">use Benchmark qw(:all) ;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">sub testMoose {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $val1 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $val2 = rand( 1000000 );</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $test = Test-&gt;new( &#39;val1&#39; =&gt; $val1, &#39;val2&#39; =&gt; $val2 );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  die &quot;Wrong val&quot; unless $val1 == $test-&gt;val1;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  die &quot;Wrong val&quot; unless $val2 == $test-&gt;val2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">}</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">timethis ( 100000, &quot;testMoose&quot;);</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="&#39;courier new&#39;, monospace">#!/usr/bin/perl</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">package Test;</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">use Moose;</font></div><div>
<font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">has &#39;val1&#39; =&gt; ( isa =&gt; &#39;Str&#39; , is =&gt; &#39;rw&#39; );</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">has &#39;val2&#39; =&gt; ( isa =&gt; &#39;Num&#39; , is =&gt; &#39;rw&#39; );</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">no Moose;</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">__PACKAGE__-&gt;meta-&gt;make_immutable;</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">package main;</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">use Benchmark qw(:all) ;</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">sub testMoose {</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  my $val1 = rand( 1000000 );</font></div>

<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  my $val2 = rand( 1000000 );</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br></font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  my $test = Test-&gt;new( &#39;val1&#39; =&gt; $val1, &#39;val2&#39; =&gt; $val2 );</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">  die &quot;Wrong val&quot; unless $val1 == $test-&gt;val1;</font></div>
<div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">
  die &quot;Wrong val&quot; unless $val2 == $test-&gt;val2;</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">}</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" size="1" face="&#39;courier new&#39;, monospace">timethis ( 100000, &quot;testMoose&quot;);</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="&#39;courier new&#39;, monospace" size="1">
#!/usr/bin/perl</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">package Test;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">sub new {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $class = shift;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $self = { _val1 =&gt; shift, _val2 =&gt; shift };</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  bless $self, $class;</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  return $self;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">}</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">sub val1 {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $self = shift;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  return $self-&gt;{ _val1 };</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">}</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">sub val2 {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $self = shift;</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  return $self-&gt;{ _val2 };</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">}</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">package main;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">use Benchmark qw(:all) ;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">sub testMoose {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $val1 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $val2 = rand( 1000000 );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  my $test = Test-&gt;new( $val1, $val2 );</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  die &quot;Wrong val&quot; unless $val1 == $test-&gt;val1;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">  die &quot;Wrong val&quot; unless $val2 == $test-&gt;val2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">}</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace" size="1">timethis ( 100000, &quot;testMoose&quot;);</font></div>
</div><div><br></div>
</div>