koan_09_2.rb 853 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. class SomeClass
  2. end
  3. class Module
  4. def attribute(params='a', &block)
  5. name, default = process_args(params)
  6. ivar = "@#{name}"
  7. assigned = ivar + "_assigned"
  8. # getters
  9. define_method name do
  10. default = instance_eval &block if block # set default to block
  11. unless instance_variable_get(assigned).nil?
  12. instance_variable_get(ivar)
  13. else
  14. default
  15. end
  16. end
  17. # predicates
  18. define_method(name + "?") { !send(name).nil? }
  19. # setters
  20. define_method name + "=" do |value|
  21. instance_variable_set ivar, value
  22. instance_variable_set assigned, true
  23. end
  24. end
  25. private
  26. def process_args(params)
  27. name = nil
  28. default = nil
  29. if params.is_a?(Hash)
  30. name = params.keys[0]
  31. default = params[name]
  32. else
  33. name = params
  34. end
  35. [name, default]
  36. end
  37. end