Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Passing arrayref to Moo attributes

by darcrossito (Initiate)
on Apr 20, 2013 at 08:16 UTC ( [id://1029628]=perlquestion: print w/replies, xml ) Need Help??

darcrossito has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I am new with Perl and Moo. I am trying to pass an array as attributes of a package. I read somewhere that I need to use an array ref. I want it to change the array internally. Specifically, one of the methods will be used to returned an array with one of its element changed. This is for a pacman maze. But I kept getting this error message: isa check for "maze_map" failed: Can't use string ('ArrayRefStr') as a subroutine ref while "strict refs" in use at (eval 18) line 37.

Edit: So this is my mistake. Moo has no isa. Should have checked the documentation first. And also I put Moose in the title. My bad.

Edit2: So I decided to use Moose. I have no problem right now. Will take a look if I can do similar thing like handles => { my_array => 'elements' } in Moo.

package Maze { use Moo; has 'maze_map', is => 'rw', isa => 'ArrayRef[Str]', handles => { m +y_array => 'elements' }, has 'tile_x_dim', is => 'rw', has 'tile_y_dim', is => 'rw', } my @drago = ([1,2,3],[1,3,4]); my $maze = Maze->new( maze_map => \@drago, tile_x_dim => 28, tile_y_di +m => 36 );

Replies are listed 'Best First'.
Re: Passing arrayref to Moose attributes
by davido (Cardinal) on Apr 20, 2013 at 15:25 UTC

    From Moo's Documentation:

    Unlike Mouse this module does not aim at full compatibility with Moose's surface syntax, preferring instead of provide full interoperability via the metaclass inflation capabilities described in "MOO AND MOOSE".

    This syntax difference is explained in greater detail later on in the Moo documentation, under the section "INCOMPATIBILITIES WITH MOOSE" That documentation leads you to MooX::Types::MooseLike, which leads to MooX::Types::MooseLike::Base. ...and that provides enough information for you to produce the following code, which does work.

    package Maze { use Moo; use MooX::Types::MooseLike::Base qw(:all); has 'maze_map' => ( is => 'rw', isa => ArrayRef[ArrayRef[Str]], handles => { my_array => 'elements' } ); has tile_x_dim => ( is => 'rw' ); has tile_y_dim => ( is => 'rw' ); } my @drago = ([1,2,3],[1,3,4]); my $maze = Maze->new( maze_map => \@drago, tile_x_dim => 28, tile_y_di +m => 36 );

    I made a few other changes too. You're ending lines 5, 6, and 7 with a comma where it should be a semicolon. Also, with Moo, the type isn't wrapped in quotes, whereas it is with Moose.


    Dave

      Actually, that code won't work especially well either. (Try calling $maze->my_array.) This is because Moo lacks Moose's native attribute traits feature. (MooX::HandlesVia might help though.)

      Also, FYI, Type::Tiny should run measurably faster than MooX::Types::MooseLike::Base, especially for a compound type constraint like ArrayRef[ArrayRef[Str]]. See my benchmarks.

      package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

        I don't think that's a Moo/Moose-compatibility issue (I could be wrong, and if so, would like additional clarification). It would be equally problematic with Moose, wouldn't it? At least after converting it to Moose by quoting the isa component, I get:

        Cannot delegate my_array to elements because the value of maze_map is +not an object (got 'ARRAY(0x163b880)') at...

        ...which seems to be the same type of error produced under Moo, with a slightly different message.

        But I suppose I should be asking for clarification. Should that work under Moose?


        Dave

Re: Passing arrayref to Moose attributes
by moritz (Cardinal) on Apr 20, 2013 at 08:39 UTC
Re: Passing arrayref to Moose attributes
by hdb (Monsignor) on Apr 20, 2013 at 14:12 UTC

    In the headline, you are asking a Moose question but in the code you are using Moo. Does Moo support 'ArrayRef' etc as well? If I change use Moo; to use Moose; and follow moritz' advise, I get no error anymore. I am not too familiar with Moo and Moose, just a guess..

    UPDATE: Just found this on http://search.cpan.org/~mstrout/Moo-1.001000/lib/Moo.pm:

    isa

    Takes a coderef which is meant to validate the attribute. Unlike Moose, Moo does not include a basic type system, so instead of doing isa => 'Num', one should do

    isa => sub { die "$_[0] is not a number!" unless looks_like_number $_[0] },
Re: Passing arrayref to Moose attributes
by darcrossito (Initiate) on Apr 28, 2013 at 08:38 UTC

    Thank you very much for your answers. I did not know that there is no email notifications for reply. Will check about it tonight.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1029628]
Approved by moritz
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (4)
As of 2024-04-18 20:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found