def push(*values, &block)
      raise_future_proof_exception if finished?
      value = if block_given?
        begin
          block.call(*values)
        rescue => e
          e
        end
      else
        values.size == 1 ? values[0] : values
      end
      super(value)
    end
def push(*values, &block)
      raise_future_proof_exception if finished?
      value = if block_given?
        begin
          block.call(*values)
        rescue => e
          e
        end
      else
        values.size == 1 ? values[0] : values
      end
      super(value)
    end
Pushes value into a queue by executing it.
 If execution results in an exception
 then exception is stored itself.

 @note allowed only when queue is running.