Report abuse

require 'rubygems'
require 'parse_tree'

class Class
  def arguments(method)
    # @_args used for caching the values
    @_args = Hash.new unless @_args
    unless @_args.has_key?(method)
      sexp_array = ParseTree.translate(self, method)
      @_args[method] = self.class.arg_search(sexp_array)
    end
    @_args[method]
  end

  private

  def self.arg_search(sexp_array)
    if sexp_array.shift == :args
      sexp_array.find_all { |e| e.kind_of?(Symbol) }
    else
      sexp_array.each do |node|
        if node.kind_of?(Array)
          args = arg_search(node)
          return args if args
        end
      end
      nil
    end
  end
end

class X
  def y(a, b, d = 2, e = 'hello world')
  end

  def z
  end

  def w(alpha, beta, gamma)
  end
end

puts X.arguments(:y).inspect
puts X.arguments(:z).inspect
puts X.arguments(:w).inspect