1package App::Netdisco::Worker::Loader; 2 3use strict; 4use warnings; 5 6use Module::Load (); 7use Dancer qw/:moose :syntax/; 8 9use Moo::Role; 10use namespace::clean; 11 12has [qw/workers_check 13 workers_early 14 workers_main 15 workers_user 16 workers_store 17 workers_late/] => ( is => 'rw' ); 18 19sub load_workers { 20 my $self = shift; 21 my $action = $self->job->action or die "missing action\n"; 22 23 my @core_plugins = @{ setting('worker_plugins') || [] }; 24 my @user_plugins = @{ setting('extra_worker_plugins') || [] }; 25 26 # load worker plugins for our action 27 foreach my $plugin (@user_plugins, @core_plugins) { 28 $plugin =~ s/^X::/+App::NetdiscoX::Worker::Plugin::/; 29 $plugin = 'App::Netdisco::Worker::Plugin::'. $plugin 30 if $plugin !~ m/^\+/; 31 $plugin =~ s/^\+//; 32 33 next unless $plugin =~ m/::Plugin::${action}(?:::|$)/i; 34 $ENV{ND2_LOG_PLUGINS} && debug "loading worker plugin $plugin"; 35 Module::Load::load $plugin; 36 } 37 38 # now vars->{workers} is populated, we set the dispatch order 39 my $workers = vars->{'workers'}->{$action} || {}; 40 #use DDP; p vars->{'workers'}; 41 42 foreach my $phase (qw/check early main user store late/) { 43 my $pname = "workers_${phase}"; 44 my @wset = (); 45 46 foreach my $namespace (sort keys %{ $workers->{$phase} }) { 47 foreach my $priority (sort {$b <=> $a} 48 keys %{ $workers->{$phase}->{$namespace} }) { 49 push @wset, @{ $workers->{$phase}->{$namespace}->{$priority} }; 50 } 51 } 52 53 $self->$pname( \@wset ); 54 } 55} 56 57true; 58