# abstract.rb

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