If that was just done as part of a test suite though, and not in production, the
performance hit might be worth it. -- Darren Duncan
On 2013.05.20 3:07 PM, Chris Prather wrote:
Using the hashref directly totally circumvents moose. You would need to write
something like MooseX::Globref that replaces the instance type with a restricted
hash. This would seriously impact performance.
-Chris
—
Sent from Mailbox <https://bit.ly/SZvoJe> for iPhone
On Mon, May 20, 2013 at 5:55 PM, Sam Brain <s...@stanford.edu
<mailto:s...@stanford.edu>> wrote:
I have a simple application which uses Moose (example copied from
Moose::Manual::MooseX pages)
package User;
use Moose;
use MooseX::StrictConstructor;
use namespace::autoclean;
has 'name' => (is => 'rw', isa => 'Str');
has 'email' => (is => 'rw', isa => 'Str');
package main;
my $bob = User->new( name => 'Bob', email => 'b...@example.com' );
say $bob->name; # prints 'Bob'
say $bob->naem; # Exits with error: 'Can't locate object method "naem" ..
All is good so far.
Then, much later, in an Idiot Moment, I forgot my "objects" were Moose
objects and not hashrefs, and wrote:
say $bob->{name}; # prints 'Bob' (!)
say "OK" unless($bob->{naem}); # prints "OK", gives no error!
$bob->name = "Robert"; # dies with "Can't modify non-lvalue subroutine
call..." - Good!
$bob->{name} = "Robert"; # doesn't die!
say $bob->name; # prints 'Robert' (!)
$bob->{naem} = "Roberto";
say $bob->{naem}; # prints 'Roberto' (!)
say $bob->naem; # Exits with error: 'Can't locate object method "naem" '
(Whew!)
say Dumper($bob); # gives:
# $VAR1 = bless( {
# 'email' => 'b...@example.com',
# 'naem' => 'Roberto',
# 'name' => 'Robert'
# }, 'User' );
Now I know any software cannot be totally immune from extreme idiocy like
mine, but I was surprised how quickly I got myself in trouble. Is there a
MooseX::StrictSomething which could have help me avoided this? (Yes I know:
"more exercise of the Little Grey Cells" - apart from that?)
Thanks
Sam Brain
--
Sam Brain
Department of Radiation Oncology
Stanford Cancer Center
Phone: 650-723-6967