views:

26

answers:

1

Is there a way to know whether or not a method has been overridden by a subclass programmatically? Something that works like this:

class BaseModel
  def create
    puts "superclass"
  end
end

class SomeModel < BaseModel
  def create
    puts "subclass"
  end
end

puts SomeModel.overridden_instance_methods #=> [:create]

Any ideas?

+4  A: 
SomeModel.instance_methods(false) & BaseModel.instance_methods

The false makes instance_methods not include inherited methods. We then use set intersection to find all the methods that were defined on SomeModel which have previously been defined on BaseModel (or Object).

sepp2k
no way, that's super sick. thanks!
viatropos
Jörg W Mittag
Be aware, though, that this won't catch cases where SomeModel mixed-in a module that defined create(). This expression will only give you the methods that SomeModel has directly overridden.
jason.rickman
[Follow up question for modules](http://stackoverflow.com/questions/3488429/how-do-you-list-included-modules-in-a-ruby-class)
viatropos