Whoops, I realized this is a lot simpler than I was making
it out to be.
HostSet has an attribute of the roles to apply to the hosts.
The HostSet roles do 'after BUILD => ...' and add that.
Ta-da.
Thanks.
Mark
On Tue, 20 Dec 2011, Mark Hedges wrote:
>
> 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
>