This solution is by memory, it seems my website is down. I will post a corrected version if there are any bugs in this but hopefully the idea is clear. # knowledge.rb class Module def attribute(*args, &block) # Normalise args = args.inject([]) {|memo, arg| if arg.kind_of? Hash arg.map {|k,v| memo << [k, (block or lambda {v})]}; memo else memo << [arg, (block or lambda {instance_variable_get "@#{arg}"})] end } # Generate args.each {|name, block| # Retrieval define_method("#{name}") {instance_variable_get "@#{name}" or instance_eval &block} # Query define_method("#{name}?") {send "#{name}"} # Assignment define_method("#{name}=") {|value| # Generate a simple accessor to avoid problems with nils and defaults class << self; self; end.send 'define_method', "#{name}", lambda {value} unless value instance_variable_set "#{name}", value } } end # attribute end # class Module Should handle multiple arguments, block supercedes hash parameters and so on. Not very pretty or particularly fast. E -- Posted via http://www.ruby-forum.com/.