module Finalizable::Finalization

Class methods

Public Instance Methods

final(*names) click to toggle source
# File lib/finalizable/finalization.rb, line 10
def final(*names)
  @@final_methods[self] = names
end
method_added(method_name) click to toggle source
Calls superclass method
# File lib/finalizable/finalization.rb, line 18
def method_added(method_name)
  super(method_name)
  prevent_override?(method_name)
end
prevent_override?(method_name) click to toggle source
# File lib/finalizable/finalization.rb, line 23
def prevent_override?(method_name)
  raise_error_if_prohibited_methods_is_overridden(method_name)
  warn_if_prohibited_methods_is_overridden(method_name)
end
raise_error_if_prohibited_methods_is_overridden(method_name) click to toggle source
# File lib/finalizable/finalization.rb, line 28
def raise_error_if_prohibited_methods_is_overridden(method_name)
  @@final_methods.each do |class_name, final_methods|
    ancestors = self.ancestors.dup
    ancestors.shift # remove myself from the list
    if ancestors.include?(class_name) && final_methods.include?(method_name)
      raise Finalizable::OverrideError, "Child class '#{self}' should not override parent class method '#{class_name}.#{method_name}'."
    end
  end
end
somewhat_final(*names) click to toggle source
# File lib/finalizable/finalization.rb, line 14
def somewhat_final(*names)
  @@somewhat_final_methods[self] = names
end
warn_if_prohibited_methods_is_overridden(method_name) click to toggle source
# File lib/finalizable/finalization.rb, line 38
def warn_if_prohibited_methods_is_overridden(method_name)
  @@somewhat_final_methods.each do |class_name, final_methods|
    ancestors = self.ancestors.dup
    ancestors.shift # remove myself from the list
    if ancestors.include?(class_name) && final_methods.include?(method_name)
      warn "WARNING: Child class '#{self}' should not override parent class method '#{class_name}.#{method_name}'."
    end
  end
end