# File lib/abingo/experiment.rb, line 64
  def self.start_experiment!(test_name, alternatives_array, conversion_name = nil)
    conversion_name ||= test_name
    conversion_name.gsub!(" ", "_")
    cloned_alternatives_array = alternatives_array.clone
    ActiveRecord::Base.transaction do
      experiment = Abingo::Experiment.find_or_create_by_test_name(test_name)
      experiment.alternatives.destroy_all  #Blows away alternatives for pre-existing experiments.
      while (cloned_alternatives_array.size > 0)
        alt = cloned_alternatives_array[0]
        weight = cloned_alternatives_array.size - (cloned_alternatives_array - [alt]).size
        experiment.alternatives.build(:content => alt, :weight => weight,
          :lookup => Abingo::Alternative.calculate_lookup(test_name, alt))
        cloned_alternatives_array -= [alt]
      end
      experiment.status = "Live"
      experiment.save(:validate => false)
      Abingo.cache.write("Abingo::Experiment::exists(#{test_name})".gsub(" ", "_"), 1)

      #This might have issues in very, very high concurrency environments...

      tests_listening_to_conversion = Abingo.cache.read("Abingo::tests_listening_to_conversion#{conversion_name}") || []
      tests_listening_to_conversion += [test_name] unless tests_listening_to_conversion.include? test_name
      Abingo.cache.write("Abingo::tests_listening_to_conversion#{conversion_name}", tests_listening_to_conversion)
      experiment
    end
  end