class PhusionPassenger::AbstractInstaller

installer.run
installer = ConcereteInstallerClass.new(options…)
Usage:
the installation itself.
Subclasses must at least implement the #run_steps method which handles
passenger-install-apache2-module and passenger-install-nginx-module.
Abstract base class for text mode installers. Used by

def after_install

def after_install
	STDOUT.write(Utils::AnsiColors::RESET)
	STDOUT.flush
end

def before_install

def before_install
	STDOUT.write(Utils::AnsiColors::DEFAULT_TERMINAL_COLOR)
	STDOUT.flush
end

def check_dependencies(show_new_screen = true)

def check_dependencies(show_new_screen = true)
	new_screen if show_new_screen
	missing_dependencies = []
	puts "<banner>Checking for required software...</banner>"
	puts
	dependencies.each do |dep|
		print " * #{dep.name}... "
		result = dep.check
		if result.found?
			if result.found_at
				puts "<green>found at #{result.found_at}</green>"
			else
				puts "<green>found</green>"
			end
		else
			puts "<red>not found</red>"
			missing_dependencies << dep
		end
	end
	
	if missing_dependencies.empty?
		return true
	else
		puts
		puts "<red>Some required software is not installed.</red>"
		puts "But don't worry, this installer will tell you how to install them.\n"
		puts "<b>Press Enter to continue, or Ctrl-C to abort.</b>"
		if PhusionPassenger.originally_packaged?
			wait
		else
			wait(10)
		end
		
		line
		puts
		puts "<banner>Installation instructions for required software</banner>"
		puts
		missing_dependencies.each do |dep|
			print_dependency_installation_instructions(dep)
			puts
		end
		if respond_to?(:users_guide)
			puts "If the aforementioned instructions didn't solve your problem, then please take"
			puts "a look at the Users Guide:"
			puts
			puts "  <yellow>#{users_guide}</yellow>"
		end
		return false
	end
end

def dependencies

def dependencies
	return []
end

def download(url, output)

def download(url, output)
	if PlatformInfo.find_command("wget")
		return sh("wget", "-O", output, url)
	else
		return sh("curl", url, "-f", "-L", "-o", output)
	end
end

def initialize(options = {})

installer.instance_variable_get(:"@foo") # => "bar"
installer = AbstractInstaller.new(:foo => "bar")

variables, for example:
Create an AbstractInstaller. All options will be stored as instance
def initialize(options = {})
	@stdout = STDOUT
	@stderr = STDERR
	options.each_pair do |key, value|
		instance_variable_set(:"@#{key}", value)
	end
end

def interactive?

def interactive?
	return !@auto
end

def line

def line
	puts "--------------------------------------------"
end

def new_screen

def new_screen
	puts
	line
	puts
end

def non_interactive?

def non_interactive?
	return !interactive?
end

def print(text)

def print(text)
	@stdout.write(Utils::AnsiColors.ansi_colorize(text))
	@stdout.flush
end

def print_dependency_installation_instructions(dep)

def print_dependency_installation_instructions(dep)
	puts " * To install <yellow>#{dep.name}</yellow>:"
	if dep.install_comments
		puts "   " << dep.install_comments
	end
	if !dep.install_command.nil?
		puts "   Please run <b>#{dep.install_command}</b> as root."
	elsif !dep.install_instructions.nil?
		puts "   " << dep.install_instructions
	elsif !dep.website.nil?
		puts "   Please download it from <b>#{dep.website}</b>"
		if !dep.website_comments.nil?
			puts "   (#{dep.website_comments})"
		end
	else
		puts "   Search Google."
	end
end

def prompt(message, default_value = nil)

def prompt(message, default_value = nil)
	done = false
	while !done
		print "#{message}: "
		
		if non_interactive? && default_value
			puts default_value
			return default_value
		end
		
		begin
			result = STDIN.readline
		rescue EOFError
			exit 2
		end
		result.strip!
		if result.empty?
			if default_value
				result = default_value
				done = true
			else
				done = !block_given? || yield(result)
			end
		else
			done = !block_given? || yield(result)
		end
	end
	return result
end

def prompt_confirmation(message)

def prompt_confirmation(message)
	result = prompt("#{message} [y/n]") do |value|
		if value.downcase == 'y' || value.downcase == 'n'
			true
		else
			puts_error "Invalid input '#{value}'; please enter either 'y' or 'n'."
			false
		end
	end
	return result.downcase == 'y'
end

def puts(text = nil)

def puts(text = nil)
	if text
		@stdout.puts(Utils::AnsiColors.ansi_colorize(text))
	else
		@stdout.puts
	end
	@stdout.flush
end

def puts_error(text)

def puts_error(text)
	@stderr.puts(Utils::AnsiColors.ansi_colorize("<red>#{text}</red>"))
	@stderr.flush
end

def rake(*args)

def rake(*args)
	require 'phusion_passenger/platform_info/ruby'
	if !PlatformInfo.rake_command
		puts_error 'Cannot find Rake.'
		raise Abort
	end
	sh("#{PlatformInfo.rake_command} #{args.join(' ')}")
end

def rake!(*args)

def rake!(*args)
	require 'phusion_passenger/platform_info/ruby'
	if !PlatformInfo.rake_command
		puts_error 'Cannot find Rake.'
		raise Abort
	end
	sh!("#{PlatformInfo.rake_command} #{args.join(' ')}")
end

def render_template(name, options = {})

def render_template(name, options = {})
	puts ConsoleTextTemplate.new({ :file => name }, options).result
end

def run

Start the installation by calling the #install! method.
def run
	before_install
	run_steps
	return true
rescue Abort
	puts
	return false
rescue PlatformInfo::RuntimeError => e
	new_screen
	puts "<red>An error occurred</red>"
	puts
	puts e.message
	exit 1
ensure
	after_install
end

def sh(*args)

def sh(*args)
	puts "# #{args.join(' ')}"
	result = system(*args)
	if result
		return true
	elsif $?.signaled? && $?.termsig == Signal.list["INT"]
		raise Interrupt
	else
		return false
	end
end

def sh!(*args)

def sh!(*args)
	if !sh(*args)
		puts_error "*** Command failed: #{args.join(' ')}"
		raise CommandError
	end
end

def use_stderr

def use_stderr
	old_stdout = @stdout
	begin
		@stdout = STDERR
		yield
	ensure
		@stdout = old_stdout
	end
end

def wait(timeout = nil)

def wait(timeout = nil)
	if interactive?
		if timeout
			require 'timeout' unless defined?(Timeout)
			begin
				Timeout.timeout(timeout) do
					STDIN.readline
				end
			rescue Timeout::Error
				# Do nothing.
			end
		else
			STDIN.readline
		end
	end
rescue Interrupt
	raise Abort
end