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.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.