I am trying to use Moose with Moose::Meta::Attribute::Native::Trait::Array but it looks like ArrayRef helper doesn't work for me. Bellow is my code which returns
Can't call method "add_item" on unblessed reference at bug.pl line 42.
I use Moose 2.0007 and Perl v5.10.1. Moose::Autobox is installed. I would appreciate any suggestion.
#!/usr/bin/perl
use strict;
package CycleSplit;
use Moose;
has 'name'=>(isa=>'Str', is=>'rw');
has 'start'=>(isa=>'Num', is=>'rw');
has 'length'=>(isa=>'Num', is=>'rw');
1;
package Cycle;
use Moose;
my @empty=();
has 'name' => (isa => 'Str', is => 'rw');
has 'splits' => (
traits => ['Array'],
isa=>'ArrayRef[CycleSplit]',
is => 'rw',
default=>sub { [] },
handles=>{
add_item=>'push',
},
);
no Moose;
1;
package Main;
sub Main {
my $cyc=Cycle->new();
$cyc->name("Days of week");
for my $i (1..7) {
my $spl=CycleSplit->new();
$spl->name("Day $i");
$spl->start($i/7-(1/7));
$spl->length(1/7);
$cyc->splits->add_item($spl);
}
my $text='';
foreach my $spl ($cyc->splits) {
$text.=$spl->name." ";
}
print $text;
}
Main;
handles add method to class itself, not to the attribute. Another problem is that splits attribute is still arrayref, so you need dereference in seconds foreach. Corrected code is as follows:
sub Main {
my $cyc=Cycle->new();
$cyc->name("Days of week");
for my $i (1..7) {
my $spl=CycleSplit->new();
$spl->name("Day $i");
$spl->start($i/7-(1/7));
$spl->length(1/7);
$cyc->add_item($spl); # removed splits
}
my $text='';
foreach my $spl (@{ $cyc->splits }) { # added array dereference
$text.=$spl->name." ";
}
print $text;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With