Re: Moose not adequately idiot-proof?

[email protected] (Darren Duncan) Mon, 20 May 2013 16:07:06 -0700
Newsgroups perl.moose
Message-ID <[email protected]>
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 <[email protected]
> <mailto:[email protected]>> 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 => '[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
>
>