def choose!(context = nil)
      @user.cleanup_old_experiments!
      # Only run the process once
      return alternative if @alternative_chosen

      new_participant = @user[@experiment.key].nil?
      if override_is_alternative?
        self.alternative = @options[:override]
        if should_store_alternative? && !@user[@experiment.key]
          self.alternative.increment_participation
        end
      elsif @options[:disabled] || Split.configuration.disabled?
        self.alternative = @experiment.control
      elsif @experiment.has_winner?
        self.alternative = @experiment.winner
      else
        cleanup_old_versions

        if exclude_user?
          self.alternative = @experiment.control
        else
          self.alternative = @user[@experiment.key]
          if alternative.nil?
            if @experiment.cohorting_disabled?
              self.alternative = @experiment.control
            else
              self.alternative = @experiment.next_alternative

              # Increment the number of participants since we are actually choosing a new alternative
              self.alternative.increment_participation

              run_callback context, Split.configuration.on_trial_choose
            end
          end
        end
      end

      new_participant_and_cohorting_disabled = new_participant && @experiment.cohorting_disabled?

      @user[@experiment.key] = alternative.name unless @experiment.has_winner? || !should_store_alternative? || new_participant_and_cohorting_disabled
      @alternative_chosen = true
      run_callback context, Split.configuration.on_trial unless @options[:disabled] || Split.configuration.disabled? || new_participant_and_cohorting_disabled
      alternative
    end
Choose an alternative, add a participant, and save the alternative choice on the user. This
method is guaranteed to only run once, and will skip the alternative choosing process if run
a second time.