def exec!(object, options)
      mark_as_failure! # going to execute! set to failure initially
      @options = options
      if object.method(name.to_sym).arity > 1
        mark_as_success! if object.public_send(name.to_sym, options, **options) != false
      else
        mark_as_success! if object.public_send(name.to_sym, options) != false
      end
      
      @block.(options) if success? && @block

      self.executed = true

      self
    
    rescue => e
      @error = e.message

      self.executed = false
      
      mark_as_failure!
      
      self
    end
def exec!(object, options)
      mark_as_failure! # going to execute! set to failure initially
      @options = options
      if object.method(name.to_sym).arity > 1
        mark_as_success! if object.public_send(name.to_sym, options, **options) != false
      else
        mark_as_success! if object.public_send(name.to_sym, options) != false
      end
      
      @block.(options) if success? && @block

      self.executed = true

      self
    
    rescue => e
      @error = e.message

      self.executed = false
      
      mark_as_failure!
      
      self
    end
Track#exec! executes the steps defined in the operation class