1 package CatalystX::DynamicComponent;
2 use MooseX::Role::Parameterized;
3 use MooseX::Types::Moose qw/Str CodeRef ArrayRef/;
4 use namespace::autoclean;
6 our $VERSION = 0.000001;
13 parameter 'pre_immutable_hook' => (
15 predicate => 'has_pre_immutable_hook',
18 parameter 'COMPONENT' => (
20 predicate => 'has_custom_component_method',
26 my $pre_immutable_hook = $p->pre_immutable_hook;
29 my ($app, $name, $config, $methods) = @_;
31 my $appclass = blessed($app) || $app;
33 $type =~ s/^${appclass}:://; # FIXME - I think there is shit in C::Utils to do this.
36 my $meta = Moose->init_meta( for_class => $name );
38 my @superclasses = @{ $config->{superclasses} || [] };
39 push(@superclasses, 'Catalyst::' . $type) unless @superclasses;
40 $meta->superclasses(@superclasses);
42 if (my @roles = @{ $config->{roles}||[] }) {
43 Moose::Util::apply_all_roles( $name, @roles);
46 if ($p->has_custom_component_method) {
47 $meta->add_method(COMPONENT => $p->COMPONENT);
50 $app->$pre_immutable_hook($meta) if $p->has_pre_immutable_hook;
53 foreach my $name (keys %$methods) {
54 $meta->add_method($name => $methods->{$name});
56 $meta->make_immutable;
58 my $instance = $app->setup_component($name);
59 $app->components->{ $name } = $instance;