Re: cumulative role attrs? role meta attrs?

[email protected] (Mark Hedges)
Newsgroups perl.moose
Message-ID <[email protected]>
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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.