Hi Monks,
I am struggling to understand how I can assign to an ArrayRef accessor. I am trying to use Moo and Types::Standard for my class attributes. My efforts always produce a extra ArrayRef that is one level deeper than I need.
As far as I can tell, you have to assign a reference to the attribute once it's marked as a 'Ref' but in doing so I end up with an array reference inside an array reference. Perhaps I want a list type but I don't see one.
Code
#!perl
use v5.22;
use warnings;
use Test::Deep;
use Test::More;
BEGIN {
package MockObj;
use Moo;
use Types::Standard qw(ArrayRef Str);
use namespace::autoclean;
has 'files' => (
# `rpw` would be better as, in practice,
# this is only used inside the class
is => 'rw',
isa => ArrayRef[Str],
);
1;
};
my $mock = MockObj->new;
my @list = ('string one', 'Different string', 'With feeling');
note explain \@list;
$mock->files( \@list );
my @strings = $mock->files;
note explain \@strings;
cmp_deeply(\@strings, bag(@list));
done_testing;
Result
# [
# 'string one',
# 'Different string',
# 'With feeling'
# ]
# [
# [
# 'string one',
# 'Different string',
# 'With feeling'
# ]
# ]
not ok 1
# Failed test at t/test-case.t line 31.
# Comparing $data as a Bag
# Missing: 'Different string', 'With feeling', 'string one'
# Extra: 1 reference
Your enlighenment is much appreciated,