---
name: "MooseX::Traits::Pluggable"
section: "3pm"
platform: "linux"
package: "libmoosex-traits-pluggable-perl"
version: "0.12-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/MooseX::Traits::Pluggable"
---

# MooseX::Traits::Pluggable(3pm)

trait loading and resolution for Moose

## NAME

MooseX::Traits::Pluggable - trait loading and resolution for Moose

## DESCRIPTION

See MooseX::Traits for usage information.

Use `"new_with_traits"` to construct an object with a list of traits and `"apply_traits"` to apply traits to an instance.

Adds support for class precedence search for traits and some extra attributes, described below.

## TRAIT SEARCH

If the value of "\_trait\_namespace" in MooseX::Traits starts with a `"+"` the namespace will be considered relative to the `"class_precedence_list"` (ie. `@ISA`) of the original class.

Example:

```
  package Class1
  use Moose;
  package Class1::Trait::Foo;
  use Moose::Role;
  has 'bar' => (
      is       => 'ro',
      isa      => 'Str',
      required => 1,
  );
  package Class2;
  use parent 'Class1';
  with 'MooseX::Traits';
  has '+_trait_namespace' => (default => '+Trait');
  has '+_traits_behave_like_roles' => (default => 1);
  package Class2::Trait::Bar;
  use Moose::Role;
  has 'baz' => (
      is       => 'ro',
      isa      => 'Str',
      required => 1,
  );
  package main;
  my $instance = Class2->new_with_traits(
      traits => ['Foo', 'Bar'],
      bar => 'baz',
      baz => 'quux',
  );
  $instance->does('Class1::Trait::Foo'); # true
  $instance->does('Class2::Trait::Bar'); # true
```

## NAMESPACE ARRAYS

You can search multiple namespaces for traits, for example:

```
  has '+_trait_namespace' => (
      default => sub { [qw/+Trait +Role ExtraNS::Trait/] }
  );
```

Will search in the `"class_precedence_list"` for `"::Trait::TheTrait"` and `"::Role::TheTrait"` and then for `"ExtraNS::Trait::TheTrait"`.

## CORRECT ROLE BEHAVIOR

By default, a method from a role will override a class method, this however is not the behavior one expects when applying a Moose role using the normal methods.

If you want the behavior to be consistent with Moose roles, then use this configuration attribute in your class:

```
  has '+_traits_behave_like_roles' => (default => 1);
```

This may or may not become the default in the future, for now you have to ask for it for backward compatibility reasons.

## EXTRA ATTRIBUTES

### \_original\_class\_name

When traits are applied to your class or instance, you get an anonymous class back whose name will be not the same as your original class. So `"ref $self"` will not be `"Class"`, but `"$self->_original_class_name"` will be.

### \_traits

List of the (unresolved) traits applied to the instance.

### \_resolved\_traits

List of traits applied to the instance resolved to full package names.

## SEE ALSO

MooseX::Traits, MooseX::Object::Pluggable, CatalystX::Component::Traits

## BUGS

Please report any bugs or feature requests to `"bug-moosex-traits-pluggable at` `rt.cpan.org"`, or through the web interface at \<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MooseX-Traits-Pluggable\>.  I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

## AUTHOR

Rafael Kitover `"<rkitover@cpan.org>"`

## CONTRIBUTORS

Tomas Doran, `"<bobtfish@bobtfish.net>"` Fitz Elliott, `"<fitz.elliott@gmail.com>"` Andreas Marienborg, `"<andreas.marienborg@gmail.com>"` Alexander Hartmaier, `"<abraxxa@cpan.org>"`

## COPYRIGHT & LICENSE

Copyright (c) 2014 by the aforementioned "AUTHOR" and "CONTRIBUTORS".

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