From: MenTaLguY Date: 2006-02-20T03:53:02+09:00 Subject: [SOLUTION] metakoans.rb (#67) I've got two. Here's the first one I did: class Module def attribute( name, &default_block ) name, default_value = name.to_a.first if name.is_a? Hash default_block ||= proc { default_value } ivar = "@#{ name }".to_sym define_method name do value = instance_variable_get ivar unless value or instance_variables.include? ivar.to_s instance_variable_set ivar, instance_eval( &default_block ) else value end end define_method "#{ name }=" do |value| instance_variable_set ivar, value end alias_method "#{ name }?", name end end 23 lines. Then here's the second one I did, after Ara clarified that I needn't use instance variables: class Module def attribute( name, &default_block ) name, default_value = name.to_a.first if name.is_a? Hash default_block ||= proc { default_value } name = name.to_sym define_method( "__default__#{ name }", &default_block ) define_method( :__attributes__ ) do @__attributes__ ||= Hash.new { |h, k| h[k] = send "__default__#{ k }" } end define_method( name ) { __attributes__[name] } define_method( "#{ name }=" ) { |value| __attributes__[name] = value } alias_method "#{ name }?", name end end 18 lines. Actually, this last one can be mildly golfed down to 13 lines, at the cost of getting a little ugly and a little slow: class Module def attribute( name, &default_block ) name, default_value = name.to_a.first if name.is_a? Hash default_block ||= proc { default_value } define_method( "__default__#{ name }", &default_block ) define_method( :__attributes__ ) do @__attributes__ ||= Hash.new { |h, k| h[k] = send "__default__#{ k }" } end define_method( name ) { __attributes__[name] } define_method( "#{ name }=" ) { |value| __attributes__[name] = value } alias_method "#{ name }?", name end end Anyway, that's all. Both these versions only do one attribute at a time, since that's all the tests asked for. Plus I don't think the block would make sense for multiple attributes. And Ara? This Quiz rocked so much. Thank you! -mental