---
name: "CatalystX::Component::Traits"
section: "3pm"
platform: "linux"
package: "libcatalystx-component-traits-perl"
version: "0.19-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/CatalystX::Component::Traits"
---

# CatalystX::Component::Traits(3pm)

Automatic Trait Loading and Resolution for Catalyst Components

## NAME

CatalystX::Component::Traits - Automatic Trait Loading and Resolution for Catalyst Components

## SYNOPSIS

```
    package Catalyst::Model::SomeModel;
    with 'CatalystX::Component::Traits';
    package MyApp::Model::MyModel;
    use parent 'Catalyst::Model::SomeModel';
    package MyApp;
    __PACKAGE__->config('Model::MyModel' => {
        traits => ['SearchedForTrait', '+Fully::Qualified::Trait']
    });
```

## DESCRIPTION

Adds a "COMPONENT" in Catalyst::Component method to your Catalyst component base class that reads the optional `"traits"` parameter from app and component config and instantiates the component subclass with those traits using "new\_with\_traits" in MooseX::Traits from MooseX::Traits::Pluggable.

## TRAIT SEARCH

Trait names qualified with a `"+"` are taken to be full package names.

Unqualified names are searched for, using the algorithm described below.

### EXAMPLE

Suppose your inheritance hierarchy is:

```
    MyApp::Model::MyModel
    Catalyst::Model::CatModel
    Catalyst::Model
    Catalyst::Component
    Moose::Object
```

The configuration is:

```
    traits => ['Foo']
```

The package search order for `"Foo"` will be:

```
    MyApp::TraitFor::Model::CatModel::Foo
    Catalyst::TraitFor::Model::CatModel::Foo
```

### A MORE PATHOLOGICAL EXAMPLE

For:

```
    My::App::Controller::AController
    CatalystX::Something::ControllerBase::SomeController
    Catalyst::Controller
    Catalyst::Model
    Catalyst::Component
    Moose::Object
```

With:

```
    traits => ['Foo']
```

Search order for `"Foo"` will be:

```
    My::App::TraitFor::Controller::SomeController::Foo
    CatalystX::Something::TraitFor::Controller::SomeController::Foo
```

The `"Base"` after (M\|V\|C) is automatically removed.

## TRAIT MERGING

Traits from component class config and app config are automatically merged if you set the `"_trait_merge"` attribute default, e.g.:

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

You can remove component class config traits by prefixing their names with a `"-"` in the app config traits.

For example:

```
    package Catalyst::Model::Foo;
    has '+_trait_merge' => (default => 1);
    __PACKAGE__->config->{traits} = [qw/Foo Bar/];
    package MyApp;
    __PACKAGE__->config->{'Model::Foo'}{traits} = [qw/-Foo Baz/];
```

Will load the traits:

```
    Bar Baz
```

## AUTHOR

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

## CONTRIBUTORS

Tomas Doran, `"<bobtfish@bobtfish.net>"`

## BUGS

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

## ACKNOWLEDGEMENTS

Matt S. Trout and Tomas Doran helped me with the current design.

## COPYRIGHT & LICENSE

Copyright (c) 2014, Rafael Kitover

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