module Overrides

Allows for an overrides annotation for your methods.

This might help during refactoring (method renaming) to assure methods expected to be overriding another (and calling super) fail early during definition time instead of when called.

Usage :

class Message
  extend Overrides

  def do_send; end
  def sent_at; end
  def reply?; end
end

class Notice < Message
  overrides
  def do_send; super; end

  def reply?; nil; end
  def sent_at; nil; end

  overrides :reply?, :sent_at
end

Without arguments (before method) works with singleton methods as well :

class Message
  extend Overrides

  def self.deliver(msg); end
end

class Notice < Message
  overrides
  def self.deliver(msg); end
end

To hook it up for all classes/modules, simply do a :

Object.extend Overrides

@author kares

Constants

VERSION

Public Class Methods

includes_method?(methods, name) click to toggle source

@private

# File lib/overrides.rb, line 108
def self.includes_method?(methods, name)
  methods.include? name
end
overriden?(klass, method, instance = true) click to toggle source

Checks if a method was previously available in the given module’s method resolution chain. Assumes instance methods by default.

# File lib/overrides.rb, line 91
def self.overriden?(klass, method, instance = true)
  if instance
    klass.included_modules.each do |mod|
      return true if includes_method? mod.instance_methods(true), method
    end
    return false unless klass.is_a?(Class) # "only" a Module ...
    return includes_method? klass.superclass.instance_methods(true), method
  else
    (class << klass; self; end).included_modules.each do |mod|
      return true if includes_method? mod.instance_methods(true), method
    end
    return false unless klass.is_a?(Class) # "only" a Module ...
    return includes_method? klass.superclass.methods(true), method
  end
end

Public Instance Methods

method_added(name) click to toggle source

@private

Calls superclass method
# File lib/overrides.rb, line 72
def method_added(name)
  return super unless (@_override ||= nil); @_override = false
  unless Overrides.overriden?(self, name, true)
    raise Error, "previous (instance) method #{name.inspect} not found"
  end
  super
end
overrides(*names) click to toggle source
# File lib/overrides.rb, line 54
def overrides(*names)
  if names.empty? # next method def - singleton or instance
    @_override = true
  else
    names.each do |name| # only for instance methods
      unless Overrides.includes_method? self.instance_methods(false), name
        msg = "(instance) method #{name.inspect} not found in "
        raise NoMethodError,
          msg << ( self.is_a?(Class) ? 'class ' : 'module ' ) << self.inspect
      end
      unless Overrides.overriden?(self, name)
        raise Error, "previous (instance) method #{name.inspect} not found"
      end
    end
  end
end
singleton_method_added(name) click to toggle source

@private

Calls superclass method
# File lib/overrides.rb, line 81
def singleton_method_added(name)
  return super unless (@_override ||= nil); @_override = false
  unless Overrides.overriden?(self, name, false)
    raise Error, "previous singleton method #{name.inspect} not found"
  end
  super
end