1use strict; 2use warnings; 3use Test::More tests => 7; 4use Catalyst::Utils; 5 6{ 7 package Catalyst::Controller::SomeController; 8 use Moose; 9 extends 'Catalyst::Controller'; 10 with 'CatalystX::Component::Traits'; 11 has '+_trait_merge' => (default => 1); 12 13 package Catalyst::TraitFor::Controller::SomeController::Foo; 14 use Moose::Role; 15 has 'foo' => (is => 'ro'); 16 17 package MyApp::Controller::MyController; 18 use Moose; 19 extends 'Catalyst::Controller::SomeController'; 20 21 __PACKAGE__->config( 22 traits => ['Foo', 'Bar', 'Baz'], 23 foo => 'bar' 24 ); 25 26 sub find_app_class { 27 my $self = shift; 28 blessed($self->_application) || $self->_application; 29 } 30 31 package MyApp::TraitFor::Controller::SomeController::Bar; 32 use Moose::Role; 33 has 'bar' => (is => 'ro'); 34 35 package MyApp::TraitFor::Controller::SomeController::Baz; 36 use Moose::Role; 37 has 'baz' => (is => 'ro'); 38 39 package MyApp::TraitFor::Controller::SomeController::Quux; 40 use Moose::Role; 41 has 'quux' => (is => 'ro'); 42 43 package MyApp; 44 use Moose; 45 extends 'Catalyst'; 46 47 __PACKAGE__->config->{'Controller::MyController'}{traits} = 48 ['-Baz', 'Quux']; 49 50 $INC{'MyApp/Controller/MyController.pm'} = 1; 51 __PACKAGE__->setup; 52} 53 54my $app_class = 'MyApp'; 55ok((my $instance = MyApp::Controller::MyController->COMPONENT( 56 $app_class, 57 { bar => 'baz' } 58 )), 59 'created a component instance'); 60 61ok(($instance->does('Catalyst::TraitFor::Controller::SomeController::Foo')), 62 'instance had parent ns trait loaded from component config'); 63 64ok(($instance->does('MyApp::TraitFor::Controller::SomeController::Bar')), 65 'instance had app ns trait loaded from component config'); 66 67is eval { $instance->foo }, 'bar', 68 'trait initialized from component config works'; 69 70is eval { $instance->bar }, 'baz', 71 'trait initialized from app config works'; 72 73is $instance->find_app_class, 'MyApp', 'Can find app class passing instance'; 74 75is_deeply( 76 [MyApp->controller('MyController')->meta->calculate_all_roles]->[0]->name, 77 'Catalyst::TraitFor::Controller::SomeController::Foo|MyApp::TraitFor::Controller::SomeController::Bar|MyApp::TraitFor::Controller::SomeController::Quux', 78 'traits merged correctly' 79); 80