auto_deref

いろいろな人の書いた 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を使うべきなんでしょうね.