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