NAME

MooseX::Traits - automatically apply roles at object creation time

SYNOPSIS

Given some roles:

package Role;
use Moose::Role;
has foo => ( is => 'ro', isa => 'Int' required => 1 );

And a class:

package Class;
use Moose;
with 'MooseX::Traits';

Apply the roles to the class at new time:

my $class = Class->new( traits => ['Role'], foo => 42 );

Then use your customized class:

$class->isa('Class'); # true
$class->does('Role'); # true
$class->foo; # 42

DESCRIPTION

Often you want to create components that can be added to a class arbitrarily. This module makes it easy for the end user to use these components. Instead of requiring the user to create a named class with the desired roles applied, or applying roles to the instance one-by-one, he can just pass a traits parameter to the class's constructor. This role will then apply the roles in one go, and cache the resulting class (for efficiency). Arguments meant to initialize the applied roles' attributes can also be passed to the constructor. (This will probably break MooseX::StrictConstructor.)

ATTRIBUTES YOUR CLASS GETS

This role will add the following attributes to the consuming class.

traits

The list of traits to be applied. Acts as an init_arg and a ro accessor.

_trait_namespace

You can override the value of this attribute with default to automatically prepend a namespace to the supplied traits. (This can be overridden by prefixing the trait name with +.)

Example:

 package Another::Trait;
 use Moose::Role;
 has 'bar' => (
     is       => 'ro',
     isa      => 'Str',
     required => 1,
 );

 package Another::Class;
 use Moose;
 with 'MooseX::Traits';
 has '+_trait_namespace' => ( default => 'Another' );

 my $instance = Another::Class->new(
     traits => ['Trait'], # "Another::Trait", not "Trait"
     bar    => 'bar',
 );
 $instance->does('Trait')          # false
 $instance->does('Another::Trait') # true

 my $instance2 = Another::Class->new(
     traits => ['+Trait'], # "Trait", not "Another::Trait"
 );
 $instance2->does('Trait')          # true
 $instance2->does('Another::Trait') # false

BUGS

This role wraps new with around, which probably isn't the best idea ever conceived. I might change this implementation detail at a later date.

AUTHOR

Jonathan Rockway <jrockway@cpan.org>

COPYRIGHT AND LICENSE

Copyright 2008 Infinity Interactive, Inc.

http://www.iinteractive.com

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.