Hi. I tried to follow the example in
Moose::Cookbook::Meta::Recipe5 but I got this error: 'Can't
locate object method "table" via package
"Moose::Meta::Class::__ANON__::SERIAL::1'. I filed a bug.
What I am trying to do is create a container object for
another class of objects, apply selected roles to the
container on construction, which tell it what other roles to
apply to the contained objects.
I.e.
my $hostset = My::HostSet
->with_traits(qw( Cluster Hardware ))
->new( hostnames => [qw( foo bar baz )]);
package My::HostSet;
with 'MooseX::Traits';
has '+_trait_namespace' => ( default => 'My::Role::HostSet' );
use My::Host;
use Moose::Util qw( apply_all_roles );
has hostnames (
# ...
);
has hosts (
# ...
lazy_build => 1,
);
sub _build_hosts {
my @hosts = map My::Host->new( hostname => $_ ), @{$hostnames};
my @contained_object_roles = foo(); # ...
# here I want to find out from My::Role::HostSet::Cluster
# and My::Role::HostSet::Hardware what other roles it
# should apply to the contained objects.
apply_all_roles( $_, @contained_object_roles ) for @hosts;
return \@hosts;
}
I don't see a good way to do this. Having same name attribute in
each HostSet role class conflicts, obviously. I thought maybe
adding meta attributes to the HostSet role classes would be
the way to go, but the example doesn't work.
I don't know what I'm doing... thanks. :-)
Mark