package MooseX::Runnable::Invocation;
use Moose;
use MooseX::Types -declare => ['RunnableClass'];
-use MooseX::Types::Moose qw(Str ClassName);
+use MooseX::Types::Moose qw(Str HashRef ArrayRef);
+use namespace::autoclean;
require Class::MOP;
as Str,
where { $_ =~ /^[:A-Za-z_]+$/ };
-use namespace::clean -except => 'meta';
-# this class is just as runnable as any other, so I guess we should tag it
-with 'MooseX::Runnable', 'MooseX::Object::Pluggable';
+with 'MooseX::Runnable'; # this class technically follows
+ # MX::Runnable's protocol
has 'class' => (
is => 'ro',
has 'plugins' => (
is => 'ro',
- isa => 'ArrayRef[Str]',
- default => sub { [] },
+ isa => HashRef[ArrayRef[Str]],
+ default => sub { +{} },
required => 1,
auto_deref => 1,
);
sub BUILD {
my $self = shift;
- $self->load_plugin($_) for $self->plugins;
+
+ # it would be nice to use MX::Object::Pluggable, but our plugins
+ # are too configurable
+
+ my $plugin_ns = 'MooseX::Runnable::Invocation::Plugin::';
+ for my $plugin (keys %{$self->plugins}){
+ my $orig = $plugin;
+ $plugin = "$plugin_ns$plugin" unless $plugin =~ /^[+]/;
+ $plugin =~ s/^[+]//g;
+
+ Class::MOP::load_class( $plugin );
+
+ my $args;
+ if($plugin->meta->does_role('MooseX::Runnable::Invocation::Plugin::Role::CmdlineArgs')){
+ $args = eval {
+ $plugin->_build_initargs_from_cmdline(
+ @{$self->plugins->{$orig}},
+ );
+ };
+
+ if($@) {
+ confess "Error building initargs for $plugin: $@";
+ }
+ }
+
+ $plugin->meta->apply(
+ $self,
+ defined $args ? (rebless_params => $args) : (),
+ );
+ }
}
sub load_class {
};
}
-
sub validate_class {
my ($self, $class) = @_;
my @bad_attributes = map { $_->name } grep {
- $_->is_required && $_->has_default || $_->has_builder
- } $class->compute_all_applicable_attributes;
+ $_->is_required && !($_->has_default || $_->has_builder)
+ } $class->get_all_attributes;
confess
'By default, MooseX::Runnable calls the constructor with no'.