The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package t::Worker;
use strict;
use warnings;
use base qw/Exporter/;
use Gearman::Worker;
use Proc::Guard;
our @EXPORT = qw/
    new_worker
    /;

sub new_worker {
    my (%args) = @_;
    defined($args{func}) || die "no func in passed arguments";
    my %func = %{ delete $args{func} };
    my $w    = Gearman::Worker->new(%args);

    while (my ($f, $v) = each(%func)) {
        $w->register_function($f, ref($v) eq "ARRAY" ? @{$v} : $v);
    }

    my $pg = Proc::Guard->new(
        code => sub {
            while (1) {
                $w->work(
                    stop_if => sub {
                        my ($idle, $last_job_time) = @_;
                        return $idle;
                    }
                );
            } ## end while (1)
        }
    );

    return $pg;
} ## end sub new_worker

1;