Dead simple: Get the method object and ask for its owner:
"foo".method(:upcase)
=> #<Method: String#upcase>
"foo".method(:upcase).owner
=> String
Ruby 1.9 adds a method Method#source_location
that returns file and line number where that method is defined.
class Example; def method() end end
=> nil
Example.new.method(:method).source_location
=> ["(irb)", 11]
"foo".method(:upcase).source_location
=> nil # String#upcase is a native method that's defined in C
Rumor has it in Ruby 1.8 there is a gem ruby18_source_location
that does something similar.
Also see
Posted by Dominik Schöler to makandra dev (2013-03-20 09:28)