NAME
MooseX::Traits - Automatically apply roles at object creation time
VERSION
version 0.13
SYNOPSIS
Given some roles:
And a class:
Apply the roles to the class at new
time:
my
$class
= Class->with_traits(
'Role'
)->new(
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 apply roles to the instance one-by-one, he can just create a new class from yours with with_traits
, and then instantiate that.
There is also new_with_traits
, which exists for compatibility reasons. It accepts a traits
parameter, creates a new class with those traits, and then instantiates it.
Class->new_with_traits(
traits
=> [
qw/Foo Bar/
],
foo
=> 42,
bar
=> 1 )
returns exactly the same object as
Class->with_traits(
qw/Foo Bar/
)->new(
foo
=> 42,
bar
=> 1 )
would. But you can also store the result of with_traits
, and call other methods:
my
$c
= Class->with_traits(
qw/Foo Bar/
);
$c
->new(
foo
=> 42 );
$c
->whatever(
foo
=> 1234 );
And so on.
METHODS
- $class->with_traits( @traits )
-
Return a new class with the traits applied. Use like:
- $class->new_with_traits(%args, traits => \@traits)
-
new_with_traits
can also take a hashref, e.g.:my
$instance
=
$class
->new_with_traits({
traits
=> \
@traits
,
foo
=>
'bar'
});
ATTRIBUTES YOUR CLASS GETS
This role will add the following attributes to the consuming class.
_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;
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>
CONTRIBUTORS
Karen Etheridge <ether@cpan.org>
Florian Ragwitz <rafl@debian.org>
Tomas Doran <bobtfish@bobtfish.net>
Hans Dieter Pearcey <hdp@weftsoar.net>
Rafael Kitover <rkitover@cpan.org>
Stevan Little <stevan.little@iinteractive.com>
Alexander Hartmaier <abraxxa@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2008 by Infinity Interactive, Inc. http://www.iinteractive.com.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.