requires 'MooseX::Types::Structured' => '0.12';
requires 'namespace::autoclean';
requires 'MooseX::Types' => '0.10';
+requires 'MooseX::Role::Parameterized' => '0.05';
requires 'Catalyst::Model::Adaptor';
requires 'Catalyst::Runtime' => '5.80001';
requires 'Catalyst::Plugin::ConfigLoader';
package CatalystX::DynamicComponent;
-use Moose::Role;
+use MooseX::Role::Parameterized;
use namespace::autoclean;
-sub _setup_dynamic_component {
- my ($app, $name, $config, $component_method) = @_;
-
- my $appclass = blessed($app) || $app;
- my $type = $name;
- $type =~ s/^${appclass}:://; # FIXME - I think there is shit in C::Utils to do this.
- $type =~ s/::.*$//;
-
- my $meta = Moose->init_meta( for_class => $name );
- $meta->superclasses('Catalyst::' . $type);
-
- $meta->add_method( COMPONENT => $component_method );
-
- $meta->make_immutable;
-
- my $instance = $app->setup_component($name);
- $app->components->{ $name } = $instance;
-}
+parameter 'name' => (
+ isa => 'Str',
+ required => 1,
+);
+
+parameter 'pre_immutable_hook' => (
+ isa => 'Str',
+ predicate => 'has_pre_immutable_hook',
+);
+
+role {
+ my $p = shift;
+ my $name = $p->name;
+ my $pre_immutable_hook = $p->pre_immutable_hook if $p->has_pre_immutable_hook;
+ method $name => sub {
+ my ($app, $name, $config, $component_method) = @_;
+
+ my $appclass = blessed($app) || $app;
+ my $type = $name;
+ $type =~ s/^${appclass}:://; # FIXME - I think there is shit in C::Utils to do this.
+ $type =~ s/::.*$//;
+
+ my $meta = Moose->init_meta( for_class => $name );
+ $meta->superclasses('Catalyst::' . $type);
+ $meta->add_method( COMPONENT => $component_method );
+ $app->$pre_immutable_hook($meta) if $pre_immutable_hook;
+ $meta->make_immutable;
+
+ my $instance = $app->setup_component($name);
+ $app->components->{ $name } = $instance;
+ };
+};
1;
use Moose::Role;
use namespace::autoclean;
-with 'CatalystX::DynamicComponent'
- => { alias => { _setup_dynamic_component => '_setup_dynamic_controller' } };
+with 'CatalystX::DynamicComponent' => {
+ name => '_setup_dynamic_controller',
+};
requires 'setup_components';
# Note method reaming - allows user to modify my setup_dynamic_component without being
# forced to do it globally.
-with 'CatalystX::DynamicComponent'
- => { alias => { _setup_dynamic_component => '_setup_dynamic_model' } };
+with 'CatalystX::DynamicComponent' => {
+ name => '_setup_dynamic_model',
+};
after 'setup_components' => sub { shift->_setup_dynamic_models(@_); };