1 package # Hide from PAUSE
2 CatalystX::DynamicComponent::ModelsFromConfig::InterfaceRoles::COMPONENT;
4 use Moose::Util qw/does_role/;
5 use namespace::autoclean;
7 around 'COMPONENT' => sub {
8 my ($orig, $component_class_name, $app, $args) = @_;
10 my $interface_roles = delete $args->{interface_roles};
11 confess("No interface_roles configuration specified for $component_class_name")
12 unless $interface_roles && ref($interface_roles) eq 'ARRAY'
13 && scalar(@$interface_roles);
15 my $component = $component_class_name->$orig($app, $args);
17 foreach my $role_name (@$interface_roles) {
18 confess("$component_class_name generated an instance $component which does not perform the required $role_name role")
19 unless does_role($component, $role_name);
25 package CatalystX::DynamicComponent::ModelsFromConfig::InterfaceRoles;
27 use namespace::autoclean;
29 with 'CatalystX::DynamicComponent::ModelsFromConfig';
31 around '_setup_dynamic_model' => sub {
32 my ($orig, $app, $class_name, $config, @args) = @_;
33 my @roles = @{ delete($config->{roles}) || [] };
34 push(@roles, 'CatalystX::DynamicComponent::ModelsFromConfig::InterfaceRoles::COMPONENT');
35 $config->{roles} = \@roles;
36 $app->$orig($class_name, $config, @args);
45 CatalystX::DynamicComponent::ModelsFromConfig::InterfaceRoles - Generate simple L<Catalyst::Model::Adaptor> like models from application config, enforcing roles on the model classes.
51 use namespace::autoclean;
53 +CatalystX::DynamicComponent::ModelsFromConfig::InterfaceRoles
57 'CatalystX::DynamicComponent::ModelsFromConfig' => {
61 class => 'SomeClass', # Name of class to load and construct
62 other => 'config', # Constructor passed other parameters
63 interface_roles => [qw/ My::Role /], # Your app explodes if SomeClass doesn't do My::Role
76 L<CatalystX::DynamicComponent::ModelsFromConfig>, L<CatalystX::DynamicComponent>, L<Catalyst>.
80 Probably plenty, test suite certainly isn't comprehensive.. Patches welcome.
84 Tomas Doran (t0m) <bobtfish@bobtfish.net>
88 This code is copyright (c) 2009 Tomas Doran. This code is licensed on the same terms as perl