From: Greg Millam Date: 2006-02-21T00:41:18+09:00 Subject: Re: [SOLUTION] metakoans.rb (#67) As with everyone, it seems, some more twiddling and playing with this yielded me a better, faster, and smaller solution. This also beats my prior solution in that a? returns only true or false, and variables are kept with the object rather than in a hash with the object as a key. The reader methods also won't take an argument now. (They did before.) 9 lines with a little golfing: (8 if you ditch the line for multiple definitions, which isn't needed for passing the koans). It's pretty much the same as most of the other solutions out there, now. def attribute(arg,*rest,&b) attribute(*rest,&b) if rest.any? # Allow multiple definitions. n = (arg.is_a?(Hash) ? arg.keys[0] : arg).to_s b ||= lambda { arg.is_a?(Hash) ? arg[n] : nil } attr_writer n define_method(n) { instance_variables.include?('@'+n) ? \ instance_variable_get('@'+n) : instance_eval(&b) } define_method(n+'?') { ! [nil,false].include?(send(n)) } end Blast it, Ara, how do I stop myself from doing more and more tweaking? ;) - Greg