From: ahoward Date: 2003-06-17T07:58:46+09:00 Subject: /^attr(?:_reader|_writer)*$/ - possible RCR? does anyone else think that having attr_* keep track of the attributes might be helpful? i've done it by hand many times. i'm thinking something like this might be generally useful: attr.rb ====CUT==== class Module private alias_method :__attr_reader, :attr_reader alias_method :__attr_writer, :attr_writer alias_method :__attr, :attr def attr_reader(*symbols) __attr_reader *symbols (@reader_attributes ||= []).push *symbols end def attr_writer(*symbols) __attr_writer *symbols (@writer_attributes ||= []).push *symbols end def attr symbol, writable = false __attr symbol, writable (@reader_attributes ||= []).push symbol (@writer_attributes ||= []).push symbol if writable end public def attributes type = nil case type.to_s when %r/read|get/ @reader_attributes.clone when %r/writ|set/ @writer_attributes.clone else @reader_attributes | @writer_attributes end end end if $0 == __FILE__ class Foo attr_reader :foo attr_writer :bar attr :foobar attr :barfoo, true def not_an_attribute; end end p Foo.attributes # -> [:foo, :foobar, :barfoo, :bar] p Foo.attributes :reader # -> [:foo, :foobar, :barfoo] p Foo.attributes :writer # -> [:bar, :barfoo] end ====CUT==== here's an example where/why i've used it: class CannotMarshal < RBTree ... ... ... def _dump depth Marshal.dump {:data => to_hash, :attributes => class.attributes(:reader).sort.map{|a| send a}} end class << self def _load string cm = CannotMarshal.new loaded = Marshal.load string cm.update loaded[:data] cm.class.attributes(:writer).sort.map{|a| cm.send a, loaded[:attributes].shift} cm end end end the above requires a writer for every reader, but you get the idea... -a -- ==================================== | Ara Howard | NOAA Forecast Systems Laboratory | Information and Technology Services | Data Systems Group | R/FST 325 Broadway | Boulder, CO 80305-3328 | Email: ara.t.howard@noaa.gov | Phone: 303-497-7238 | Fax: 303-497-7259 | ~ > ruby -e 'p(%.\x2d\x29..intern)' ====================================