head	1.2;
access;
symbols
	RELEASE_8_0_0:1.1;
locks; strict;
comment	@# @;


1.2
date	2010.01.06.06.31.21;	author stas;	state dead;
branches;
next	1.1;

1.1
date	2009.06.02.17.25.37;	author stas;	state Exp;
branches;
next	;


desc
@@


1.2
log
@- Update to patchlevel 248.
@
text
@--- lib/ostruct.rb	2009/05/26 12:00:53	23580
+++ lib/ostruct.rb	2009/05/26 12:06:21	23581
@@@@ -67,28 +67,33 @@@@
     @@table.each_key{|key| new_ostruct_member(key)}
   end
 
+  def modifiable
+    if self.frozen?
+      raise TypeError, "can't modify frozen #{self.class}", caller(2)
+    end
+    @@table
+  end
+  protected :modifiable
+
   def new_ostruct_member(name)
     name = name.to_sym
     unless self.respond_to?(name)
-      meta = class << self; self; end
-      meta.send(:define_method, name) { @@table[name] }
-      meta.send(:define_method, :"#{name}=") { |x| @@table[name] = x }
+      class << self; self; end.class_eval do
+        define_method(name) { @@table[name] }
+        define_method("#{name}=") { |x| modifiable[name] = x }
+      end
     end
+    name
   end
 
   def method_missing(mid, *args) # :nodoc:
     mname = mid.id2name
     len = args.length
-    if mname =~ /=$/
+    if mname.chomp!('=')
       if len != 1
         raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
       end
-      if self.frozen?
-        raise TypeError, "can't modify frozen #{self.class}", caller(1)
-      end
-      mname.chop!
-      self.new_ostruct_member(mname)
-      @@table[mname.intern] = args[0]
+      modifiable[new_ostruct_member(mname)] = args[0]
     elsif len == 0
       @@table[mid]
     else
@


1.1
log
@- Update ruby 1.8.7 to the latest revision available from ruby-lang.org.
  This updates also borrows some important bugfixes from Ruby CVS that
  is not available in patchlevel 160 yet.
- Drop GC patch support. It is broken with the new ruby version and
  seem to require the complete rewriting.
@
text
@@

