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_with_traits( 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 new_with_traits constructor. This role will then apply the roles in one go, cache the resulting class (for efficiency), and return a new instance. Arguments meant to initialize the applied roles' attributes can also be passed to the constructor.

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_with_traits(
     traits => ['Trait'], # "Another::Trait", not "Trait"
     bar    => 'bar',
 );
 $instance->does('Trait')          # false
 $instance->does('Another::Trait') # true

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

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.