class Module def abstract(*names) if class_variables.size > 0 then class_variable_get(:@@ABSTRACT_METHODS).push *names else class_variable_set :@@ABSTRACT_METHODS, names end end end
module AbstractClass def new(*args) obj = super(*args) class_variable_get(:@@ABSTRACT_METHODS).each do |m| unless obj.methods.include?(m.to_s) then raise format("Abstract method `%s' not defined", m.to_s) end end return obj end end