From: "Maël Clérambault" Date: 2007-01-22T01:24:07+09:00 Subject: Re: [QUIZ] Method Auto Completion (#110) Here is my solution. It does not pass the supplied tests since it uses a different interface when there are multiple matches : It a raises a MultipleMethods exception with an array of the possible matches. There is an additional abbrev method in Module which defines the methods to be abbreviated. If used with the single argument 'true' it enables abbreviations for all methods of the object. the 'abbreviated_methods' private method of Object does the intersection of the defined object class's abbreviated methods and the current actual methods of the object. Then the abbreviation are caught with method_missing. quiz110.rb : class MultipleMethods < NoMethodError attr_reader :methods def initialize(methods) @methods = methods super("Multiple Choices : " + @methods.join(' ')) end end class Module attr_reader :abbreviated_methods private # Defines a list of methods to be abbreviated. # If auto = true, then all the methods are abbreviated # # class Test # abbrev # All the methods of Test will be abbreviated # end # # class Test2 # abbrev :first, :last # Only the methods first and last may be abbreviated # end # # If multiple choices are possible, a MultipleMethods exception is raised which contains a list of the matches. def abbrev(auto = true, *args) if auto.respond_to? :to_sym @abbreviated_methods ||= [] @abbreviated_methods += args.collect {|m| m.to_sym }.unshift auto.to_sym elsif args.empty? auto ? @abbreviated_methods = [] : @abbreviated_methods = nil else raise ArgumentError end end end class Object alias :abbrev_method_missing :method_missing def method_missing(sym, *args) found = abbreviated_methods.select { |m| m.to_s =~ /^#{sym}/ } if found.empty? abbrev_method_missing(sym, *args) elsif found.size == 1 send found.first, *args else raise MultipleMethods.new(found) end end private def abbreviated_methods if self.class.abbreviated_methods.nil? [] elsif self.class.abbreviated_methods.empty? methods else self.class.abbreviated_methods & methods.collect {|m| m.to_sym} end end end