class Database 
	class AlreadyOpen < StandardError; end
	class NotOpened < StandardError; end

	def initialize
		puts "Connecting to database server...done"
		@opened = nil
	end

	def open
		raise AlreadyOpen, "Cannot reopen" if @opened
		puts "Opening database..."
		@opened = true
	end

	def update(field, value)
		raise NotOpened, "Must open before updating" unless @opened
		puts "Updating '#{field}' => '#{value}'...done"
	end

	def close
		raise NotOpened, "Must open before closing" unless @opened
		puts "Closing database...done"
		@opened = nil
	end

	def quit
		close if @opened 
		puts "bye"
		exit
	end

	def help
		puts "The following commands are available:"
		Database.instance_methods(false).each { |cmd|
			puts "\t%-10s %s argument(s)" % [cmd, method(cmd).arity]
		}
	end
end

d = Database.new
print "$> "
while gets
	begin
		d.send(*split)
		# split -> ["update", "hello", "world"]
		#		one argument to d.send (an Array)
		# *split -> "update", "hello", "world"
		#		three String arguments to d.send
	rescue Database::NotOpened => err
		$stderr.puts "#{err.message}"
	rescue SystemExit
		exit
	rescue Exception => err
		$stderr.puts "Error: #{err.message}."
	end
	print "$> "
end
d.quit
