     @emitChange()
 
   setAnswerId: (task, step, answerId) ->
-    task = @_local[task.id]
-    step  = _.find task.steps, (s) -> s.id is step.id
+    step = @_getStep(task.id, step.id)
     step.answer_id = answerId
     @emitChange()
 
   setFreeResponseAnswer: (task, step, freeResponse) ->
     # Find the local objects for task and step
-    task = @_local[task.id]
-    step  = _.find task.steps, (s) -> s.id is step.id
+    step = @_getStep(task.id, step.id)
     step.free_response = freeResponse
     @emitChange()
 

    # First arg is null and ignored because it was a PUT ./completed
    # @load(task.id)

    task = @_local[task.id]
    # Only mark the step complete once
    step  = _.find task.steps, (s) -> s.id is step.id
    step.is_completed = true
    # HACK: Tack on a fake correct_answer and feedback
    if step.content?.questions?[0]?.answers[0]?

  _saved: (obj, id) -> @_loaded(obj, id)

  exports:
    isStepAnswered: (taskId, stepId) ->
      step = @_getStep(taskId, stepId)
      isAnswered = true
      if step.type is 'exercise'
        unless step.answer_id
          isAnswered = false
      isAnswered

    getStepFreeResponse: (taskId, stepId) ->
      step = @_getStep(taskId, stepId)
      step.free_response
    getStepAnswerId: (taskId, stepId) ->
      step = @_getStep(taskId, stepId)
      step.answer_id


