On Sun, 12 Dec 2004 05:17:23 +0900, itsme213 <itsme213 / hotmail.com>
wrote:
> This is the reason why there are design approaches and even
> language features meant to support encapsulating such aliasing
> within manageable boundaries while still permitting arbitrary
> object graph structures within them. Such things might not be in
> Ruby, but that does not make them less worth considering.

To me, the issue is simple. If you want to freeze more than the
references you hold, do the following:

    # This is a good argument for a "Mappable" or "Hashable" module
    # or perhaps a changed each_with_index for Hash so that it does
    # |value, key| instead of |[value, key], pseudo-index|.
  module DeepFreeze
    def	freeze
      if self.kind_of?(Hash)
	self.each { |k, v| self[k.dup.freeze] = v.dup.freeze }
      elsif self.respond_to?(:map)
        self.map { |el| el.dup.freeze }
      end

      self.instance_variables.each do |iv|
	self.instance_variable_set(iv,
	  self.instance_variable_get(iv).dup.freeze)
      end
    end
  end

It isn't completely a deep freeze, as it doesn't completely traverse
the object tree, but that could be added.

-austin
-- 
Austin Ziegler * halostatue / gmail.com
               * Alternate: austin / halostatue.ca