=encoding utf8

=head1 Mojolicious::Plugin::Minion::Workers

★★★ Доброго всем ★★★

¡ ¡ ¡ ALL GLORY TO GLORIA ! ! !

=head1 VERSION

0.9092 (up to Minion version/10+C<child minor>)

=head1 NAME

Mojolicious::Plugin::Minion::Workers - does extend base Mojolicious::Plugin::Minion
on manage Minion workers.

=head1 SYNOPSIS

  # Mojolicious (define amount workers in config)
  $self->plugin('Minion::Workers' => {Pg => ..., workers=>2, manage=>1, });
  # or pass to $app->minion->workers->manage(<number>) for run later
  $self->plugin('Minion::Workers' => {Pg => ...});

  # Mojolicious::Lite (define amount workers in config)
  plugin 'Minion::Workers' => {Pg => ..., workers=>2};

  # Add tasks to your application
  app->minion->add_task(something_slow => sub {
    my ($job, @args) = @_;
    ...
  });
  
  # But you can define tasks in config as well
  $self->plugin('Minion::Workers' => {Pg => ..., tasks => { foo_task => sub { ... }, }, });
  
  # Start manage with amount workers
  app->minion->workers->manage(4);
  # or get number from config
  app->minion->workers->manage();

  # Start jobs from anywhere in your application

=head1 DESCRIPTION

L<Mojolicious::Plugin::Minion::Workers> is a L<Mojolicious> plugin for the L<Minion> job
queue and has extending base L<Mojolicious::Plugin::Minion> for enable workers managment.

=head1 Extend base plugin config

L<Mojolicious::Plugin::Minion::Workers> apply all config options
of the base plugin L<Mojolicious::Plugin::Minion>, and define following:

=head2 workers => <integer>

Amount of Minion workers need to start/restart. None defaults.
This value can be overriden on C<< $app->minion->workers->manage(...) >>.

  ..., workers => 4, ...

=head2 manage => <boolean>

Start/restart Minion workers during plugin registration. Defaults to false.
If this option is not set then you can start Minion workers
by C<< $app->minion->workers->manage() >> see below.

  ..., manage => 1, ...

=head2 tasks => <hashref>

You can define Minion tasks in config.

  ..., tasks => {foo_task => sub { ... }, ...},

=head2 <backend name: Pg|SQLite|...> => <connection string> | <backend object> | <coderef>

If config parameter B<backend name> is a B<coderef> then returned value (connection string or backend object)
from callback will reassigned to B<backend name> config option,
i.e. C<< $conf->{<backend name>} = $conf->{<backend name>}->($app); >>.

  ..., Pg => sub { my $app = shift; ... }, ...

=head1 Manage workers

L<Mojolicious::Plugin::Minion::Workers> add attr B<workers> to the C<< $app->minion >> object.
The C<< $app->minion->workers >> object has following public methods.

=head2 manage(integer amount)

Start/restart Minion passed amount workers or get its from plugin config.
None workers mean skip managment.

  $app->minion->workers->manage(2);

Tested on standard shell commands (on Linux):

  $ perl script/app.pl daemon         # one Minion worker will be starting
  $ perl script/app.pl prefork        # your amount Minion workers will be starting
  $ morbo script/app.pl               # when morbo restarts on watch changes one Minion worker will be restarting too
  $ hypnotoad script/app.pl           # your amount Minion workers will be starting
  $ hypnotoad script/app.pl           # on hot deploy Minion workers will be restarting too
  $ hypnotoad -s script/app.pl        # Minion workers will stoping too

B<NOTE>. For shell commands C< $ morbo script/app.pl > and C< $ perl script/app.pl daemon >
amount Minion workers is B<one> process always.

B<NOTE>. In case with hypnotoad if you want C< $ kill -USR2 app_pid >
then Minion workers will not restarts, sorry.
Always use hot deploy command C< $ hypnotoad script/app.pl >.

B<BIG NOTE>. When Minion workers restarts (hypnotoad | morbo) then
B<ALL> exists Minion processes stopped and then running.
So if you run many separate apps with one database backend
then dont use this module or set separate backend databases as well.

B<NOTE>. PSGI application did not tested.

=head1 HELPERS

L<Mojolicious::Plugin::Minion::Workers> enable all helpers through
base plugin L<Mojolicious::Plugin::Minion>,
thus you dont need apply base plugin (auto register).

=head1 METHODS

L<Mojolicious::Plugin::Minion::Workers> inherits all methods from
L<Mojolicious::Plugin::Minion> and override the following new ones.

=head2 register

  $plugin->register(Mojolicious->new, <config hashref>);

Register plugin in L<Mojolicious> application.

=head1 SEE ALSO

L<Mojolicious::Plugin::Minion>, L<Minion>, L<Mojolicious::Guides>, L<https://mojolicious.org>.

=head1 AUTHOR

Михаил Че (Mikhail Che), C<< <mche[-at-]cpan.org> >>

=head1 BUGS / CONTRIBUTING

Please report any bugs or feature requests at
L<https://github.com/mche/Mojolicious-Plugin-Minion-Workers/issues>.
Pull requests also welcome.

=head1 COPYRIGHT

Copyright 2019+ Mikhail Che.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.


=cut