say i'm doing something like this


   class << self

     def attribute(*list)

       list.flatten!

       list.each do |arg|
         @attrbiutes ||= []
         @do_not_gc ||= []

         list.flatten.each do |arg|
           arg, default =
             case arg
               when Hash
                 arg.to_a.first
               else
                 [arg, nil]
             end

           @do_not_gc << default unless @do_not_gc.include? default

           unless instance_methods.include? "#{ arg }"
             module_eval <<-code
               def #{ arg }(*a)
                 unless defined? @#{ arg }
                   @#{ arg } = ObjectSpace::_id2ref #{ default.object_id }
                 end
                 if a.empty?
                   @#{ arg }
                 else
                   send('#{ arg }=', *a)
                 end
               end
               def #{ arg }=(val, *a)
                 if a.empty?
                   @#{ arg } = val
                 else
                   @#{ arg } = ([val] + a)
                 end
               end
               def #{ arg }?
                 defined? @#{ arg } and @#{ arg }
               end
             code
           end

           @attributes << "#{ arg }"
         end

         @attributes
       end

     end


which allows niceness such as

   class C
     attribute 'foo' => 42
   end

is the @do_not_gc required?  it seems like doing something like

   id = object.object_id

and then later

   value = ObjectSpace::_id2ref id

one is gambling that the original object has not been gc'd and that the id
still points to the same object.  is this accurate?

cheers.

-a
-- 
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| My religion is very simple.  My religion is kindness.
| --Tenzin Gyatso
===============================================================================