相変わらず「モダンPerl入門」を読み進めている。
「2.3 Composite」まで進んだが、ここのサンプルソースが結構間違っていた。
カンマが抜けていたり、関数名が違っていたり。
そのあたりは簡単に予想できたのだけど、大変だったのは「Shape::Composite」に
「use MooseX::AttributeHelpers」がなかったために、わけのわからないエラーに悩まされたことだ。
気づいてみれば、この章の始めのほうにもMooseX::AttributeHelpersを多用するとは書いてあるのだが、以下のようなエラーからはとても思いつかなかった。
Could not load class (Moose::Meta::Attribute::Custom::Collection::Array) because : Can't locate Moose/Meta/Attribute/Custom/Collection/Array.pm in @INC (@INC contains: lib C:/strawberry/perl/lib C:/strawberry/perl/site/lib .) at C:/strawberry/perl/site/lib/Class/MOP.pm line 153.
Could not load class (Collection::Array) because : Can't locate Collection/Array.pm in @INC (@INC contains: lib C:/strawberry/perl/lib C:/strawberry/perl/site/lib .) at C:/strawberry/perl/site/lib/Class/MOP.pm line 153.
at C:/strawberry/perl/site/lib/Class/MOP.pm line 135
Class::MOP::load_first_existing_class('Moose::Meta::Attribute::Custom::Collection::Array', 'Collection::Array') called at C:/strawberry/perl/site/lib/Moose/Util.pm line 143
Moose::Util::resolve_metaclass_alias('Attribute', 'Collection::Array') called at C:/strawberry/perl/site/lib/Moose/Meta/Attribute.pm line 97
Moose::Meta::Attribute::interpolate_class('Moose::Meta::Attribute', 'provides', 'HASH(0x1160f6c)', 'metaclass', 'Collection::Array', 'isa', 'ArrayRef', 'default', 'CODE(0x1041e44)', ...) called at C:/strawberry/perl/site/lib/Moose/Meta/Attribute.pm line 86
Moose::Meta::Attribute::interpolate_class_and_new('Moose::Meta::Attribute', 'shapes', 'provides', 'HASH(0x1160f6c)', 'metaclass', 'Collection::Array', 'isa', 'ArrayRef', 'default', ...) called at C:/strawberry/perl/site/lib/Moose/Meta/Class.pm line 510
Moose::Meta::Class::_process_new_attribute('Moose::Meta::Class=HASH(0x104fb9c)', 'shapes', 'provides', 'HASH(0x1160f6c)', 'metaclass', 'Collection::Array', 'isa', 'ArrayRef', 'default', ...) called at C:/strawberry/perl/site/lib/Moose/Meta/Class.pm line 503
Moose::Meta::Class::_process_attribute('Moose::Meta::Class=HASH(0x104fb9c)', 'shapes', 'provides', 'HASH(0x1160f6c)', 'metaclass', 'Collection::Array', 'isa', 'ArrayRef', 'default', ...) called at C:/strawberry/perl/site/lib/Moose/Meta/Class.pm line 202
Moose::Meta::Class::add_attribute('Moose::Meta::Class=HASH(0x104fb9c)', 'shapes', 'provides', 'HASH(0x1160f6c)', 'metaclass', 'Collection::Array', 'isa', 'ArrayRef', 'default', ...) called at C:/strawberry/perl/site/lib/Moose.pm line 89
Moose::has('Shape::Composite', 'shapes', 'metaclass', 'Collection::Array', 'is', 'rw', 'isa', 'ArrayRef', 'auto_deref', ...) called at C:/strawberry/perl/site/lib/Moose/Exporter.pm line 201
Moose::Exporter::__ANON__('shapes', 'metaclass', 'Collection::Array', 'is', 'rw', 'isa', 'ArrayRef', 'auto_deref', 1, ...) called at lib/Shape/Composite.pm line 15
require Shape/Composite.pm called at p051.pl line 8
main::BEGIN() called at lib/Shape/Composite.pm line 0
eval {...} called at lib/Shape/Composite.pm line 0
Compilation failed in require at p051.pl line 8.
BEGIN failed--compilation aborted at p051.pl line 8.
最終的なShape::Compositeのソースは以下のとおり。
lib/Shape/Composite.pm
package Shape::Composite;
use Moose;
use MooseX::AttributeHelpers;
with 'Shape';
has 'shapes' => (
metaclass => 'Collection::Array',
is => 'rw',
isa => 'ArrayRef',
auto_deref => 1,
default => sub { [] },
provides => {
push => 'shape_add',
},
);
no Moose;
no MooseX::AttributeHelpers;
sub resize {
my ($self, $factor) = @_;
foreach my $shape ( $self->shapes ) {
$shape->resize( $factor );
}
}
sub print {
my $self = shift;
foreach my $shape ( $self->shapes ) {
$shape->print;
}
}
1;


コメントする