From: Stefan Matthias Aust Date: 2001-05-28T19:10:06+09:00 Subject: [ruby-talk:15858] If you want explicit instvar definitions... Hi! To allow a better documentation of classes, I added a "var" method to the kernel module which helps me to write down instance variable definition is a readable manner. I'd like to some opinions whether this is a stupid idea or a useful one. Here's an example how to use it: class Game var :name, 'String' var :turn, 'Integer' var :players, 'Array', :readonly var :worlds, 'Array', :readonly end class Player var :name, 'String' var :email, 'String' var :resources, 'Integer' end And here's the implementation of "var": module Kernel def var(name, type='Object', *access) attr_reader name if access.empty? or access.include? :readonly attr_writer name if access.empty? or access.include? :writeonly end end An interesting variant is to incorporate runtime type checking: module Kernel def var(name, type='Object', *access) attr_reader name if access.empty? or access.include? :readonly if access.empty? or access.include? :writeonly eval "def #{name}=(obj) assertType(#{type =~ /\w+/; $&)}, obj) @#{name}=obj end" end end private def assertType(type, object) raise "was #{object.class} but should be #{type}" \ unless object.kind_of? type end end This currently only works for non-generic types, but with more effort (and meta-magic) it should be possible to also support Array and Hash style type checks. My idea is to wrapp arrays and hashes when they are assigned to the instance variable using some proxy object which then intercepts the []= method and delegates all other methods to the original. bye -- Stefan Matthias Aust \/ Truth Until Paradox