3

Having trouble figuring out the syntax (which I'm sure is obvious and I'm stupid) for pushing to a Moose array. This is a continuation of this question. it seems to me that I need to more than a simple value for my specific case. Trying to implement it using a Moose-ish way (maybe that's wrong?) but I'm obviously not doing it right.

use Moose::Role;
has 'tid_stack' => (
    traits => ['Array'],
    is     => 'rw',
    isa    => 'ArrayRef[Str]',
    default => sub { [] },
);


around 'process' => sub {
    my $orig = shift;
    my $self = shift;
    my ( $template ) = @_;

    $self->tid_stack->push( get_hrtid( $template ) );

    $self->$orig(@_)
};

1 Answer 1

9

You've misunderstood what traits => ['Array'] does. That allows you to set up handles methods. It does not allow you to call methods like push directly. You need to use Moose::Autobox for that (and you don't need the Array trait).

Or you could do:

has 'tid_stack' => (
    traits => ['Array'],
    is     => 'rw',
    isa    => 'ArrayRef[Str]',
    default => sub { [] },
    handles => {
      push_tid => 'push',
    },
);

...

    $self->push_tid( get_hrtid( $template ) );
Sign up to request clarification or add additional context in comments.

4 Comments

ugh... tried this.... it's driving me nuts... I know that get_hrtid returns the proper thing... but when I try to push it like this it's still not working, moose later complains of trying to operate on empty arrays.
@xenoterracide: I can't see anything wrong with the above code, can you give a more detailed error description? What code are you currently trying, and what is the error you get?
with the help of debolaz I have seemingly figured out what was wrong with what I was trying... apparently I needed to make it lazy (on top of this) though why that fixed my problem I haven't yet determined.
@xenoterracide, maybe your around method was getting called during object initialization and tid_stack wasn't initialized yet? Making it lazy causes it to get initialized on demand.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.