Moose not adequately idiot-proof?
[email protected] (Sam Brain) Mon, 20 May 2013 14:54:58 -0700
| Newsgroups | perl.moose |
|---|---|
| Message-ID | <[email protected]> |
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 => '[email protected]' ); 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' => '[email protected]', # '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