On Jun 9, 2008, at 4:40 PM, Dan Harbin wrote:

Stevan,

Thanks for the help.  I am getting the following exception:

Can't locate object method "excludes_role" via package "Class::MOP::Class" at lib/Moose/Meta/Role/Application/ToClass.pm line 25.

I'm building a class from a YAML spec, and I want to add a trait to every attribute I pull from the YAML file:

use YAML;
use Moose;
use My::Super;
use My::Trait;

my $file = shift @ARGV;
my $yaml = YAML::LoadFile($file);

my $rowclass = Moose::Meta::Class->create(
    "My::Class",
    superclasses => ['My::Super'],
);

my %columns = @{ $yaml->{columns} };
while (my ($name, $params) = each %columns) {
  my $attr = Moose::Meta::Attribute->new($name, %$params);
  My::Trait->meta->apply($attr);
  $rowclass->add_attribute($attr);
}

Am I doing something wrong?

No, sorry I gave bad advice, the metaclass of the Moose::Meta::Attribute instance is a Class::MOP::Class an therefore does not know know about roles.

Why not do:

$rowclass->add_attribute($name, %$params, traits => [ 'My::Trait' ]);

This should work as expected.

- Stevan







On Mon, Jun 9, 2008 at 3:24 PM, Stevan Little <[EMAIL PROTECTED]> wrote:
Dan,

Something like this maybe?

My::Trait->meta->apply(My::Class->meta->get_attribute('foo'));

- Stevan


On Jun 9, 2008, at 4:21 PM, Dan Harbin wrote:

Is there a way to add a trait to an attribute at runtime? I know it can be done through the "new" method of Moose::Meta::Attribute, but what about
adding one after it's been initialized?

Thanks,
Dan



Reply via email to