module ActiveJob::ConcurrencyControls

def compute_concurrency_parameter(option)

def compute_concurrency_parameter(option)
  case option
  when String, Symbol
    option.to_s
  when Proc
    instance_exec(*arguments, &option)
  end
end

def concurrency_group

def concurrency_group
  compute_concurrency_parameter(self.class.concurrency_group)
end

def concurrency_key

def concurrency_key
  if self.class.concurrency_key
    param = compute_concurrency_parameter(self.class.concurrency_key)
    case param
    when ActiveRecord::Base
      [ concurrency_group, param.class.name, param.id ]
    else
      [ concurrency_group, param ]
    end.compact.join("/")
  end
end

def concurrency_limited?

def concurrency_limited?
  concurrency_key.present?
end

def limits_concurrency(key:, to: 1, group: DEFAULT_CONCURRENCY_GROUP, duration: SolidQueue.default_concurrency_control_period)

def limits_concurrency(key:, to: 1, group: DEFAULT_CONCURRENCY_GROUP, duration: SolidQueue.default_concurrency_control_period)
  self.concurrency_key = key
  self.concurrency_limit = to
  self.concurrency_group = group
  self.concurrency_duration = duration
end