def have(*_args, template: nil, &block)
      specification = Have.new

      if template
        specification.fps = template.fps.clone
        specification.references = template.references.clone
      end

      if block
        if block.arity < 1
          specification.instance_eval(&block)
        else
          block[specification]
        end
      end

      @haves << specification

      specification
    end
def have(*_args, template: nil, &block)
      specification = Have.new

      if template
        specification.fps = template.fps.clone
        specification.references = template.references.clone
      end

      if block
        if block.arity < 1
          specification.instance_eval(&block)
        else
          block[specification]
        end
      end

      @haves << specification

      specification
    end
Adds a new {Have} specification to your job.

 @example Using a block without a variable (careful: the scope changes!)
   job.have do
     encoding('utf-8')
     file('path/to/my/input.srt')
     fps(25)
   end

 @example Using a block and providing a variable
   job.have do |have|
     have.encoding('utf-8')
     have.file('path/to/my/input.srt')
     have.fps(25)
   end

 @example Catching the reference and assigning things at any later point
   have = job.have
   have.encoding('utf-8')
   have.file('path/to/my/input.srt')
   have.fps(25)

 @example Cloning a previous specification and extending on it
   have2 = job.have(template: have1)
   have2.encoding('ISO-8859-1')
   have2.file('path/to/my/input2.srt')

 @param template [Have] optionally you can specify another {Have} as a
   template, from which all properties but the file path are cloned
 @return [Have] a reference to the newly assigned {Have}