class Person attr_accessor :name #alias for readability joy alias knows? respond_to? def initialize(name) @name = name end def action(out) puts "*#{name} #{out}*" end def say(out) puts "#{name}: #{out}" end def assert_knowledge(method) say 'I ' + ( self.knows?(method) ? 'know ' : 'don\'t know ' ) + method.to_s + '. ' end end class MartialArtsLearningTape def teach(person) def person.kung_fu # ... action 'KA-POW\'z!' end def person.ju_jitsu # ... action 'HI-YA\'s!' end # ... end end keanu = Person.new('Thomas Anderson') keanu.assert_knowledge(:kung_fu) keanu.action "gets unplugged from the martix" keanu.name = 'Neo' MartialArtsLearningTape.new.teach(keanu) keanu.assert_knowledge(:kung_fu) laurence = Person.new('Morpheus') laurence.say 'Show me. ' keanu.say "self.methods.grep(/kung_fu/)\n=> #{keanu.methods.grep(/kung_fu/)}" laurence.say 'uh....' keanu.kung_fu