Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jpmoral/91c054035136dc0d3788 to your computer and use it in GitHub Desktop.
Save jpmoral/91c054035136dc0d3788 to your computer and use it in GitHub Desktop.
module Echoer
def echoes(*phrases)
@known_phrases.concat(phrases)
@known_phrases.each do |phrase|
next if self.respond_to?(phrase.to_sym)
define_method("#{phrase}") { phrase.to_s }
end
end
def known_phrases
@known_phrases.map do |phrase|
phrase.to_s
end
end
def self.extended(mod)
mod.instance_variable_set(:@known_phrases, [])
mod.send :include, InstanceMethods
end
def inherited(subclass)
subclass.instance_variable_set(:@known_phrases, @known_phrases)
end
module InstanceMethods
def echo(phrase)
phrase.to_s
end
def known_phrases
self.class.known_phrases
end
end
end
class Person
extend Echoer
echoes :hello, :goodbye
end
class Shopper < Person
echoes :charge
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment