From: Patrick Hurley Date: 2006-02-21T02:10:33+09:00 Subject: Re: [QUIZ][SOLUTION] metakoans.rb (#67) Ok here is my solution: class Module def attribute(sym, *more, &blk) attribute(*more, &blk) unless more.empty? if sym.is_a?(Hash) sym.each_pair { |sym, dval| attribute(sym, &(blk || lambda { dval })) } else iname = "@#{sym}" define_method(sym) do if instance_variables.include?(iname) instance_variable_get(iname) else if blk then instance_eval(&blk) end end end attr_writer(sym) alias_method("#{sym}?", sym) end end end A polite and fairly readable, if completely uncommented 19 lines with support for multiple symbols both in and out of the hash. And here is the same solution painfully golfed into 4 lines of code -- by the way, having unit tests are invaluable when golfing, I should have realized this as golfing is just a deranged form of refactoring, but not being a golfer this was enlightening :-) class Module;def attribute(s,*r,&b);attribute(*r,&b) if r.any? ;(Hash===s)? (s.each {|s,d|attribute(s,&(b||lambda{d}))}):(define_method(s){ instance_variables.include?("@"+s)?instance_variable_get("@"+s):(b&& instance_eval(&b)||nil)};attr_writer(s);alias_method(s+"?",s));end;end pth