Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: Passing arrayref to Moose attributes

by davido (Archbishop)
on Apr 20, 2013 at 15:25 UTC ( #1029647=note: print w/ replies, xml ) Need Help??


in reply to Passing arrayref to Moo attributes

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


Comment on Re: Passing arrayref to Moose attributes
Download Code
Re^2: Passing arrayref to Moose attributes
by tobyink (Abbot) on Apr 20, 2013 at 17:46 UTC

    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

        Under Moose you need to add traits => ["Array"] to the attribute declaration. See Moose::Meta::Attribute::Native::Trait::Array.

        With Moo you'd use handles_via => "Array" but you'd need to install MooX::HandlesVia first.

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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1029647]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2014-12-29 08:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (185 votes), past polls