class Class
def abstract(*args)
args.each do |method_name|
define_method(method_name) do |*args|
if method_name == :initialize
msg = "#{self.class.name} is an abstract class."
else
msg = "#{self.class.name}##{method_name} is an abstract method."
end
raise NotImplementedError.new(msg)
end
end
end
end
class Animal
abstract :initialize, :move
end
class Dog < Animal
def initialize
@type = :Dog
end
end
dog = Dog.new
dog.move
class Cat < Animal
def initialize
@type = :Cat
end
def move
"Running!"
end
end
puts Cat.new.move
class Dog
def move
"walk!"
end
end
puts dog.move