class Rufus::Scheduler::Job

def initialize(scheduler, original, opts, block)

def initialize(scheduler, original, opts, block)
  @scheduler = scheduler
  @original = original
  @opts = opts
  @handler = block
  @callable =
    if block.respond_to?(:arity)
      block
    elsif block.respond_to?(:call)
      block.method(:call)
    elsif block.is_a?(Class)
      @handler = block.new
      @handler.method(:call) rescue nil
    else
      nil
    end
  @scheduled_at = EoTime.now
  @unscheduled_at = nil
  @last_time = nil
  @discard_past = opts[:discard_past]
  @locals = opts[:locals] || opts[:l] || {}
  @local_mutex = Mutex.new
  @id = determine_id
  @name = opts[:name] || opts[:n]
  fail(
    ArgumentError, 'missing block or callable to schedule', caller[2..-1]
  ) unless @callable
  @tags = Array(opts[:tag] || opts[:tags]).collect { |t| t.to_s }
  @count = 0
  @last_work_time = 0.0
  @mean_work_time = 0.0
  # tidy up options
  if @opts[:allow_overlap] == false || @opts[:allow_overlapping] == false
    @opts[:overlap] = false
  end
  if m = @opts[:mutex]
    @opts[:mutex] = Array(m)
  end
end