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 for iPhone

On Mon, May 20, 2013 at 5:55 PM, Sam Brain <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

Reply via email to