- Use
method_missing
to redefine how an object reacts when askedhas_unknown_attribute
. - Use
define_method
to create a boolean version of Ruby's inbuiltattr_accessor
method.
attr_accessor method using define_method
def self.attr_accessor?(attr)
read_method = "#{attr}?"
write_method = "#{attr}="
self.send(:define_method, read_method) { instance_variable_get("@#{attr}") }
self.send(:define_method, write_method) { |value| instance_variable_set("@#{attr}", value) }
end
Whilst these are only very simple examples, metaprogramming isn't quite as terrifying as I first thought.