module ExecJS::Runtimes

def self.autodetect

def self.autodetect
  from_environment || best_available ||
    raise(RuntimeUnavailable, "Could not find a JavaScript runtime. " +
      "See https://github.com/sstephenson/execjs for a list of available runtimes.")
end

def self.best_available

def self.best_available
  runtimes.find(&:available?)
end

def self.from_environment

def self.from_environment
  if name = ENV["EXECJS_RUNTIME"]
    if runtime = const_get(name)
      if runtime.available?
        runtime if runtime.available?
      else
        raise RuntimeUnavailable, "#{name} runtime is not available on this system"
      end
    elsif !name.empty?
      raise RuntimeUnavailable, "#{name} runtime is not defined"
    end
  end
end

def self.names

def self.names
  constants
end

def self.runtimes

def self.runtimes
  @runtimes ||= [
    RubyRacer,
    RubyRhino,
    Mustang,
    Node,
    JavaScriptCore,
    Spidermonkey,
    JScript
  ]
end