いろいろな人の書いた Mooseを使ったコードを見ていたら "auto_deref"というのがあった。
名前の通りなんですが、マニュアルを見ると ArrayRefとHashRefを自動でデリファレンスされる
というものみたいですね。
foreach my $str ( @{$sample->array} ) { do_something(); }
こんなコードを書いていて、結局面倒だなって思っていたんだけど、やっぱり
対処法があったんですね。ただ pushとか配列に適用する処理のときは使えない
みたい。
#!/usr/bin/perl package SampleClass; use Moose; has strs => ( is => 'rw', isa => 'ArrayRef[Str]', required => 1, auto_deref => 1, ); __PACKAGE__->meta->make_immutable; no Moose; package main; my $sample = SampleClass->new( strs => [ qw(aaa bbb ccc) ] ); print "before\n"; foreach my $str ( $sample->strs ) { print "str : $str \n"; } push $sample->strs, "ddd"; # error push @{$sample->strs}, "ddd"; # ok print "after\n"; foreach my $str ( $sample->strs ) { print "str : $str \n"; }
ただ配列の値を保持するっていうぐらいのときは
いいんだろうけど、頻繁に push, popしたりする
ときは MooseX::AttributeHelpersを使うべきなんでしょうね.