<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>research/animate.rb</filename>
    </added>
    <added>
      <filename>research/draw.rb</filename>
    </added>
    <added>
      <filename>research/module.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -100,6 +100,14 @@ public class Error_c
     trace(text);
   }
 
+  // error.c:167
+  public function
+  rb_warning(text:String):void
+  {
+    if (!rc.RTEST(rc.ruby_verbose())) return;
+    trace(text);
+  }
+
   public function
   rb_error_frozen(text:String):void
   {</diff>
      <filename>flash/src/ruby/internals/Error_c.as</filename>
    </modified>
    <modified>
      <diff>@@ -92,6 +92,12 @@ public class Object_c
     rc.class_c.rb_define_method(rb_cClass, &quot;allocate&quot;, rb_obj_alloc, 0);
     rc.class_c.rb_define_method(rb_cClass, &quot;new&quot;, rb_class_new_instance, -1);
 
+    rc.class_c.rb_define_private_method(rb_cModule, &quot;attr&quot;, rb_mod_attr, -1);
+    rc.class_c.rb_define_private_method(rb_cModule, &quot;attr_reader&quot;, rb_mod_attr_reader, -1);
+    rc.class_c.rb_define_private_method(rb_cModule, &quot;attr_writer&quot;, rb_mod_attr_writer, -1);
+    rc.class_c.rb_define_private_method(rb_cModule, &quot;attr_accessor&quot;, rb_mod_attr_accessor, -1);
+
+
     rb_cData = rc.class_c.rb_define_class(&quot;Data&quot;, rc.object_c.rb_cObject);
     // undef alloc func
 
@@ -274,6 +280,59 @@ public class Object_c
     return obj;
   }
 
+  // object.c:1535
+  public function
+  rb_mod_attr_reader(argc:int, argv:StackPointer, klass:RClass):Value
+  {
+    var i:int;
+
+    for (i = 0; i &lt; argc; i++) {
+      rc.vm_method_c.rb_attr(klass, rc.string_c.rb_to_id(argv.get_at(i)), true, false, true);
+    }
+
+    return rc.Qnil;
+  }
+
+  // object.c:1546
+  public function
+  rb_mod_attr(argc:int, argv:StackPointer, klass:RClass):Value
+  {
+    if (argc == 2 &amp;&amp; (argv.get_at(1) == rc.Qtrue || argv.get_at(1) == rc.Qfalse)) {
+      rc.error_c.rb_warning(&quot;optional boolean argument is obsoleted&quot;);
+      rc.vm_method_c.rb_attr(klass, rc.string_c.rb_to_id(argv.get_at(0)), true, rc.RTEST(argv.get_at(1)), true);
+      return rc.Qnil;
+    }
+    return rb_mod_attr_reader(argc, argv, klass);
+  }
+
+  // object.c:1565
+  public function
+  rb_mod_attr_writer(argc:int, argv:StackPointer, klass:RClass):Value
+  {
+    var i:int;
+
+    for (i = 0; i &lt; argc; i++) {
+      rc.vm_method_c.rb_attr(klass, rc.string_c.rb_to_id(argv.get_at(i)), false, true, true);
+    }
+
+    return rc.Qnil;
+  }
+
+  // object:1591
+  public function
+  rb_mod_attr_accessor(argc:int, argv:StackPointer, klass:RClass):Value
+  {
+    var i:int;
+
+    for (i = 0; i &lt; argc; i++) {
+      rc.vm_method_c.rb_attr(klass, rc.string_c.rb_to_id(argv.get_at(i)), true, true, true);
+    }
+
+    return rc.Qnil;
+  }
+
+
+
 
 }
 }</diff>
      <filename>flash/src/ruby/internals/Object_c.as</filename>
    </modified>
    <modified>
      <diff>@@ -209,6 +209,14 @@ public class Parse_y
     }
   }
 
+  // parse.y:9302
+  public function
+  rb_is_local_id(id:int):Boolean
+  {
+    if (is_local_id(id)) return true;
+    return false;
+  }
+
   public function
   Init_sym():void
   {</diff>
      <filename>flash/src/ruby/internals/Parse_y.as</filename>
    </modified>
    <modified>
      <diff>@@ -7,15 +7,16 @@ package ruby.internals
 public dynamic class RClass extends RObject
 {
   public var name:String = null;
-  //public var rbasic:RBasic = new RBasic();
 
-  //public var iv_tbl:Object = {};
-  public var m_tbl:Object = {};
   public var super_class:RClass = null;
+  public var iv_tbl:Object = new Object();
+
+  public var m_tbl:Object = new Object();
 
   public function RClass(name:String = null, super_class:RClass = null, klass:RClass=null)
   {
     super(klass);
+    this.iv_index_tbl = new Object();
     this.name = name;
     this.super_class = super_class;
     this.flags = Value.T_CLASS;</diff>
      <filename>flash/src/ruby/internals/RClass.as</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,9 @@
 package ruby.internals
 {
-public class RFloat extends Value
+public class RFloat extends RBasic
 {
+  public var float_value:Number;
+
   public function RFloat()
   {
     super();</diff>
      <filename>flash/src/ruby/internals/RFloat.as</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,10 @@ import ruby.internals.Value;
 
 public class RObject extends RBasic
 {
-  public var iv_tbl:Object = {};
+  public var ivptr:Array;
+
+  // Actual storage on a class, but just a pointer on an object
+  public var iv_index_tbl:Object;
 
   public function RObject(klass:RClass=null)
   {</diff>
      <filename>flash/src/ruby/internals/RObject.as</filename>
    </modified>
    <modified>
      <diff>@@ -104,23 +104,31 @@ public class RubyCore
   public var rb_cFlashObject:RClass;
   public var rb_cFlashClass:RClass;
 
-  public function run_func(doc_class:DisplayObject, local_size:int, stack_max:int, block:Function):void  {
+  public function
+  run_func(doc_class:DisplayObject, local_size:int, stack_max:int, block:Function):void
+  {
     init();
     variable_c.rb_define_global_const(&quot;TopSprite&quot;, wrap_flash_obj(doc_class));
     eval_c.ruby_run_node(iseqval_from_func(local_size, stack_max, block));
   }
 
-  public function run(bytecode:String, doc_class:DisplayObject=null):void  {
+  public function
+  run(bytecode:String, doc_class:DisplayObject=null):void
+  {
     var decoder:JSONDecoder = new JSONDecoder( bytecode, this )
     run_array(decoder.getValue(), doc_class);
   }
 
-  public function run_array(iseq_array:Array, doc_class:DisplayObject=null):void {
+  public function
+  run_array(iseq_array:Array, doc_class:DisplayObject=null):void
+  {
     init();
     run_iseqval(iseqval_from_array(iseq_array), doc_class);
   }
 
-  public function run_iseqval(iseqval:Value, doc_class:DisplayObject=null):void {
+  public function
+  run_iseqval(iseqval:Value, doc_class:DisplayObject=null):void
+  {
     init();
     if (doc_class) {
       variable_c.rb_define_global_const(&quot;TopSprite&quot;, wrap_flash_obj(doc_class));
@@ -480,30 +488,71 @@ public class RubyCore
     return NOEX_WITH(n, rb_safe_level());
   }
 
+  // node.h
   public function NEW_NODE(t:uint, a0:*, a1:*, a2:*):Node {
     return gc_c.rb_node_newnode(t, a0, a1, a2);
   }
 
+  // node.h
   public function NEW_BLOCK(a:*):Node {
     return NEW_NODE(Node.NODE_BLOCK, a, null, null);
   }
 
+  // node.h
   public function NEW_CFUNC(f:Function, c:int):Node {
     return NEW_NODE(Node.NODE_CFUNC, f, c, null);
   }
 
+  // node.h
   public function NEW_IFUNC(f:Function, c:*):Node {
     return NEW_NODE(Node.NODE_IFUNC, f, c, null);
   }
 
+  // node.h
   public function NEW_METHOD(n:Value,x:Value,v:uint):Node {
     return NEW_NODE(Node.NODE_METHOD, x, n, v);
   }
 
+  // node.h
   public function NEW_FBODY(n:Value,i:Value):Node {
     return NEW_NODE(Node.NODE_FBODY, i, n, null);
   }
 
+  // node.h
+  public function NEW_IVAR(v:int):Node {
+    return NEW_NODE(Node.NODE_IVAR, v, null, null);
+  }
+
+  // node.h
+  public function NEW_ATTRSET(a:int):Node {
+    return NEW_NODE(Node.NODE_ATTRSET, a, null, null);
+  }
+
+  // ruby.h:794
+  public function FL_ABLE(x:Value):Boolean
+  { return !SPECIAL_CONST_P(x) &amp;&amp; x.BUILTIN_TYPE() != Value.T_NODE; }
+
+  // ruby.h:802
+  public function OBJ_TAINTED(x:Value):Boolean
+  { return (x.flags &amp; Value.FL_TAINT) != 0; }
+  public function OBJ_TAINT(x:Value):void
+  { x.flags |= Value.FL_TAINT; }
+  public function OBJ_UNTRUSTED(x:Value):Boolean
+  { return (x.flags &amp; Value.FL_UNTRUSTED) != 0; }
+  public function OBJ_UNRUST(x:Value):void
+  { x.flags |= Value.FL_UNTRUSTED; }
+  public function OBJ_INFECT(x:Value, s:Value):void
+  {
+    if (FL_ABLE(x) &amp;&amp; FL_ABLE(s)) {
+      x.flags |= (x.flags &amp; (Value.FL_TAINT | Value.FL_UNTRUSTED));
+    }
+  }
+
+  public function OBJ_FROZEN(x:Value):Boolean
+  { return (x.flags &amp; Value.FL_FREEZE) != 0; }
+  public function OBJ_FREEZE(x:Value):void
+  { x.flags |= Value.FL_FREEZE; }
+
   // eval_safe.c:19
   public function
   rb_safe_level():int
@@ -867,6 +916,55 @@ public class RubyCore
     return parse_y.rb_intern2(str);
   }
 
+  public function
+  ruby_vm_verbose_ptr(vm:RbVm):Value
+  {
+    return vm.verbose;
+  }
+
+  public function
+  ruby_verbose():Value
+  {
+    return ruby_vm_verbose_ptr(GET_VM());
+  }
+
+  // eval_intern.h:192
+  public function
+  SCOPE_TEST(f:int):Boolean
+  {
+    return (vm_c.vm_cref().nd_visi &amp; f) != 0;
+  }
+
+  // eval_intern.h:193
+  public function
+  SCOPE_CHECK(f:int):Boolean
+  {
+    return vm_c.vm_cref().nd_visi == f;
+  }
+
+  // ruby.h:531
+  public function
+  ROBJECT_NUMIV(o:Value):int
+  {
+    if (RObject(o).ivptr) {
+      return RObject(o).ivptr.length;
+    } else {
+      return 0;
+    }
+  }
+
+  public function
+  ROBJECT_IVPTR(o:Value):Array
+  {
+    return RObject(o).ivptr;
+  }
+
+  public function
+  ROBJECT_IV_INDEX_TBL(o:Value):Object
+  {
+    return RObject(o).iv_index_tbl;
+  }
+
 }
 }
 </diff>
      <filename>flash/src/ruby/internals/RubyCore.as</filename>
    </modified>
    <modified>
      <diff>@@ -268,6 +268,22 @@ public class RubyFrame
   }
 
   public function
+  getinstancevariable(id_str:String):void
+  {
+    var id:int = rc.parse_y.rb_intern(id_str);
+    var val:Value = rc.variable_c.rb_ivar_get(reg_cfp.self, id);
+    reg_sp.push(val);
+  }
+
+  public function
+  setinstancevariable(id_str:String):void
+  {
+    var id:int = rc.parse_y.rb_intern(id_str);
+    var val:Value = reg_sp.pop();
+    rc.variable_c.rb_ivar_set(reg_cfp.self, id, val);
+  }
+
+  public function
   getconstant(id_str:String):void
   {
     var klass:Value = reg_sp.pop();</diff>
      <filename>flash/src/ruby/internals/RubyFrame.as</filename>
    </modified>
    <modified>
      <diff>@@ -132,35 +132,74 @@ public class Variable_c
   }
 
   protected function
-  generic_ivar_set(obj:RObject, id:String, val:*):void
+  generic_ivar_set(obj:Value, id:int, val:*):void
   {
+    rc.error_c.rb_bug(&quot;generic ivar get&quot;);
   }
 
   protected function
-  generic_ivar_get(obj:RObject, id:String):*
+  generic_ivar_get(obj:Value, id:int):*
   {
-    return undefined;//return obj.iv_tbl[id];
+    rc.error_c.rb_bug(&quot;generic ivar get&quot;);
+    return undefined;
   }
 
-  protected function
-  rb_ivar_set(obj:RObject, id:int, val:*):void
+  public function
+  rb_iv_set(obj:Value, name:String, val:*):void
   {
-    if (obj is RClass) {
-      obj.iv_tbl[id] = val;
-    }
-
+    rb_ivar_set(obj, rc.parse_y.rb_intern(name), val);
   }
 
+  // variable.c:1666
   public function
-  rb_iv_set(obj:RObject, name:String, val:*):void
+  mod_av_set(klass:Value, id:int, val:Value, isconst:Boolean):void
   {
-    rb_ivar_set(obj, rc.parse_y.rb_intern(name), val);
+    var dest:String = isconst ? &quot;constant&quot; : &quot;class variable&quot;;
+
+    if (!rc.OBJ_UNTRUSTED(klass) &amp;&amp; rc.rb_safe_level() &gt;= 4) {
+      rc.error_c.rb_raise(rc.error_c.rb_eSecurityError, &quot;Insecure: can't set &quot;+dest);
+    }
+    if (rc.OBJ_FROZEN(klass)) {
+      if (klass.BUILTIN_TYPE() == Value.T_MODULE) {
+        rc.error_c.rb_error_frozen(&quot;module&quot;);
+      }
+      else {
+        rc.error_c.rb_error_frozen(&quot;class&quot;);
+      }
+    }
+    if (!RClass(klass).iv_tbl) {
+      RClass(klass).iv_tbl = new Object();
+    }
+    else if (isconst) {
+      var value:Value = rc.Qfalse;
+
+      if (RClass(klass).iv_tbl[id] != undefined) {
+        value = RClass(klass).iv_tbl[id];
+        if (value == rc.Qundef) {
+          rc.error_c.rb_bug(&quot;autoload_delete not implemented.&quot;);
+          // autoload_delete(klass, id);
+        } else {
+          rc.error_c.rb_warn(&quot;already initialized &quot; + dest + &quot; &quot; +
+                             rc.parse_y.rb_id2name(id));
+        }
+      }
+    }
+
+    if (isconst) {
+      rc.vm_c.rb_vm_change_state();
+    }
+    RClass(klass).iv_tbl[id] = val;
   }
 
   public function
-  rb_const_set(obj:RObject, id:int, val:*):void
+  rb_const_set(klass:Value, id:int, val:*):void
   {
-    obj.iv_tbl[id] = val;
+    if (rc.NIL_P(klass)) {
+      rc.error_c.rb_raise(rc.error_c.rb_eTypeError,
+                          &quot;no class/module to define constant &quot; +
+                          rc.parse_y.rb_id2name(id));
+    }
+    mod_av_set(klass, id, val, true);
   }
 
   public function
@@ -179,7 +218,7 @@ public class Variable_c
       }
       path = klass.iv_tbl[classid];
       path = rc.string_c.rb_str_dup(rc.parse_y.rb_id2str(rc.SYM2ID(path)));
-      // OBJ_FREEZE(path);
+      rc.OBJ_FREEZE(path);
       klass.iv_tbl[classpath] = path;
       delete klass.iv_tbl[classid];
 
@@ -224,7 +263,7 @@ public class Variable_c
         }
       }
       path = rc.string_c.rb_str_new(&quot;#&lt;&quot;+s+&quot;:&quot;+klass.toString()+&quot;&gt;&quot;);
-      // OBJ_FREEZE(path)
+      rc.OBJ_FREEZE(path)
       rb_ivar_set(klass, tmp_classpath, path);
 
       return path;
@@ -243,8 +282,7 @@ public class Variable_c
       rc.string_c.rb_str_cat2(str, &quot;::&quot;);
       rc.string_c.rb_str_cat2(str, name);
     }
-    // TODO: @skipped freeze
-    // OBJ_FREEZE(str);
+    rc.OBJ_FREEZE(str);
     rb_ivar_set(klass, classpath, str);
     klass.name = name;
   }
@@ -287,38 +325,116 @@ public class Variable_c
   ivar_get(obj:Value, id:int, warn:Boolean):*
   {
     var val:*;
+    var ptr:Array;
+    var iv_index_tbl:Object;
+    var len:int;
+    var index:int;
 
     switch (obj.get_type()) {
       case Value.T_OBJECT:
-        val = RObject(obj).iv_tbl[id];
-        if (val != undefined &amp;&amp; val != rc.Qundef) {
+        len = rc.ROBJECT_NUMIV(obj);
+        ptr = rc.ROBJECT_IVPTR(obj);
+        iv_index_tbl = rc.ROBJECT_IV_INDEX_TBL(obj);
+        if (!iv_index_tbl) break;
+        if (iv_index_tbl[id] == undefined) break;
+        else index = iv_index_tbl[id];
+        val = ptr[index];
+        if (val != rc.Qundef)
           return val;
-        }
         break;
       case Value.T_CLASS:
       case Value.T_MODULE:
-        val = RObject(obj).iv_tbl[id];
+        val = RClass(obj).iv_tbl[id];
         if (val != undefined) {
           return val;
         }
         break;
       default:
+        rc.error_c.rb_bug(&quot;generic ivar not implemented&quot;);
         //if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
         //  return generic_ivar_get(obj, id, warn);
         //}
         break;
     }
+    if (warn) {
+      rc.error_c.rb_warning(&quot;instance variable &quot;+rc.parse_y.rb_id2name(id)+&quot; not initialized&quot;);
+    }
     return rc.Qnil;
   }
 
   public function
-  rb_ivar_get(obj:RObject, id:int):*
+  rb_ivar_get(obj:Value, id:int):*
   {
    return ivar_get(obj, id, true);
   }
 
+  // variable.c:991
+  public function
+  rb_ivar_set(obj:Value, id:int, val:Value):Value
+  {
+    var iv_index_tbl:Object;
+    var index:int;
+    var i:int, len:int;
+    var ivar_extended:Boolean;
+
+    if (!rc.OBJ_UNTRUSTED(obj) &amp;&amp; rc.rb_safe_level() &gt;= 4) {
+      rc.error_c.rb_raise(rc.error_c.rb_eSecurityError, &quot;Insecure: can't modify instance variable&quot;);
+    }
+    if (rc.OBJ_FROZEN(obj)) rc.error_c.rb_error_frozen(&quot;object&quot;);
+    switch (rc.TYPE(obj)) {
+      case Value.T_OBJECT:
+        iv_index_tbl = rc.ROBJECT_IV_INDEX_TBL(obj);
+        if (!iv_index_tbl) {
+          var klass:RClass = rc.object_c.rb_obj_class(obj);
+          iv_index_tbl = RClass(klass).iv_index_tbl;
+          if (!iv_index_tbl) {
+            iv_index_tbl = RClass(klass).iv_index_tbl = new Object();
+          }
+        }
+        ivar_extended = false;
+        if (iv_index_tbl[id] == undefined) {
+          if (iv_index_tbl.num_entries == undefined) {
+            index = iv_index_tbl.num_entries = 0;
+          } else {
+            index = iv_index_tbl.num_entries;
+          }
+          iv_index_tbl[id] = index;
+          iv_index_tbl.num_entries = iv_index_tbl.num_entries+1;
+          ivar_extended = true;
+        } else {
+          index = iv_index_tbl[id];
+        }
+        // Bunch of code to manage the size of the array which
+        // isn't needed since the array will automatically change size
+        // for us in AS3.
+        len = rc.ROBJECT_NUMIV(obj);
+        var ptr:Array = rc.ROBJECT_IVPTR(obj);
+        if (len &lt;= index) {
+          var newsize:int = (index+1) + (index+1)/4;
+          if (!ptr) {
+            ptr = RObject(obj).ivptr = new Array(newsize);
+          }
+          for (; len &lt; newsize; len++) {
+            ptr[len] = rc.Qundef;
+          }
+          RObject(obj).iv_index_tbl = iv_index_tbl;
+        }
+        ptr[index] = val;
+        break;
+      case Value.T_CLASS:
+      case Value.T_MODULE:
+        if (!RClass(obj).iv_tbl) RClass(obj).iv_tbl = new Object();
+        RClass(obj).iv_tbl[id] = val;
+        break;
+      default:
+        generic_ivar_set(obj, id, val);
+        break;
+    }
+    return val;
+  }
+
   public function
-  rb_iv_get(obj:RObject, name:String):*
+  rb_iv_get(obj:Value, name:String):*
   {
     return rb_ivar_get(obj, rc.parse_y.rb_intern(name));
   }</diff>
      <filename>flash/src/ruby/internals/Variable_c.as</filename>
    </modified>
    <modified>
      <diff>@@ -86,6 +86,13 @@ public class Vm_c
     vm_init_redefined_flag();
   }
 
+  // vm.c:46
+  public function
+  rb_vm_change_state():void
+  {
+    INC_VM_STATE_VERSION();
+  }
+
   // vm.c:917
   protected function
   vm_init_redefined_flag():void</diff>
      <filename>flash/src/ruby/internals/Vm_c.as</filename>
    </modified>
    <modified>
      <diff>@@ -233,6 +233,49 @@ public class Vm_method_c
     return rb_get_method_body(klass, id, null);
   }
 
+  // vm_method.c:429
+  public function
+  rb_attr(klass:RClass, id:int, read:Boolean, write:Boolean, ex:Boolean):void
+  {
+    var name:String;
+    var attriv:int;
+    var noex:int;
+
+    if (!ex) {
+      noex = Node.NOEX_PUBLIC;
+    }
+    else {
+      if (rc.SCOPE_TEST(Node.NOEX_PRIVATE)) {
+        noex = Node.NOEX_PRIVATE;
+        rc.error_c.rb_warning(rc.SCOPE_CHECK(Node.NOEX_MODFUNC) ?
+                              &quot;attribute accessor as module_function&quot; :
+                              &quot;private attribute?&quot;);
+      }
+      else if (rc.SCOPE_TEST(Node.NOEX_PROTECTED)) {
+        noex = Node.NOEX_PROTECTED;
+      }
+      else {
+        noex = Node.NOEX_PUBLIC;
+      }
+    }
+
+    if (rc.parse_y.rb_is_local_id(id) &amp;&amp; !rc.parse_y.rb_is_const_id(id)) {
+      rc.error_c.rb_name_error(id, &quot;invalid attribute name '&quot;+rc.parse_y.rb_id2name(id) + &quot;'&quot;);
+    }
+    name = rc.parse_y.rb_id2name(id);
+    if (!name) {
+      rc.error_c.rb_raise(rc.error_c.rb_eArgError, &quot;argument needs to be a symbol or string&quot;);
+    }
+    attriv = rc.parse_y.rb_intern(&quot;@&quot;+name);
+    if (read) {
+      rb_add_method(klass, id, rc.NEW_IVAR(attriv), noex);
+    }
+    if (write) {
+      rb_add_method(klass, rc.parse_y.rb_id_attrset(id), rc.NEW_ATTRSET(attriv), noex);
+    }
+  }
+
+
 
 }
 }</diff>
      <filename>flash/src/ruby/internals/Vm_method_c.as</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,52 @@
 
+class Rectangle
+  attr_accessor :x, :y, :width, :height
+  def draw(sprite)
+    sprite.drawRect(@x, @y, @width, @height)
+  end
+end
 
+class Circle
+  attr_accessor :x, :y, :radius
+  def diameter=(v)
+    @radius = v/2
+  end
+  def draw(sprite)
+    sprite.drawCircle(@x, @y, @radius)
+  end
+end
+
+module Geometry
+  def rectangle props
+    r = Rectangle.new
+    r.x = props[:x] || 0
+    r.y = props[:y] || 0
+    r.width = props[:width] = 10
+    r.height = props[:height] = 10
+    r
+  end
+  def circle(props)
+    c = Circle.new
+    c.x = props[:x] || 0
+    c.y = props[:y] || 0
+    if props[:radius]
+      c.radius = props[:radius]
+    elsif props[:diameter]
+      c.diameter = props[:diameter]
+    else
+      c.radius = 10
+    end
+    c
+  end
+end
+
+include Geometry
+
+rectangle({:x=&gt;13, :y=&gt;16, :width=&gt;100, :height=&gt;20}).draw(TopSprite)
+c = circle ({:radius =&gt;30 })
+c.draw(TopSprite)
+
+=begin
 geometry {
   square {:x =&gt;5, :y =&gt;5, :width =&gt;100, :height =&gt;10 }
   circle {}
@@ -9,3 +56,4 @@ geometry {
   cricle - square
 }
 
+=end</diff>
      <filename>research/asterism.rb</filename>
    </modified>
    <modified>
      <diff>@@ -59,4 +59,6 @@ c=RubyVM::InstructionSequence.compile(IO.read('rf.rb'))
 
 # RedSun::Translate.translate(&quot;r&quot;, IO.read('research/scope.rb'))
 
-
+def bc(filename)
+  RubyVM::InstructionSequence.compile(IO.read(filename)).to_a
+end</diff>
      <filename>research/ex.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,7 @@
 a = [1,1,1]
+@color = 0xDD6622
 TopSprite.graphics.lineStyle(a[0], a[1], a[2])
-TopSprite.graphics.beginFill(0x33AAEE)
+TopSprite.graphics.beginFill(@color)
 TopSprite.graphics.drawRect(5,5,105,105)
 
 tf = Flash::Text::TextField.new
@@ -27,6 +28,8 @@ tf.x -= 50
 wait(1)
 tf.x -= 50
 
+=begin
+
 @blah = &quot;hi&quot;
 
 def talk_to_server(blah)
@@ -57,7 +60,6 @@ end
 fadein.run(tf)
 
 
-=begin
 module Sketch
   def geometry &amp;m
     instance_eval m
@@ -129,6 +131,13 @@ class Whatever
   include Bindable
   attr_accessor :x, :y
   attr_bindable :width, :height
+  attr_commit :prop
+  attr_commit_my_method :prop, :prop_my_commit_method
+  attr_commit_order :prop, 2
+  attr_commit_order :prop2, 4
+  def prop_commit(old, new)
+    # Do really long thing
+  end
 end
 
 </diff>
      <filename>research/scope.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,6 +9,8 @@ ruby -Ilib -Itest -Iresearch -rex -e 'RedSun::ABC::ABCFile.pp_yarv(@sc)'
 
 ruby -Ilib -Itest -Iresearch -rex -e 'RedSun::ABC::ABCFile.yarv_to_as3(@sc)'
 
+ruby -Ilib -Itest -Iresearch -rex -e 'RedSun::ABC::ABCFile.yarv_to_as3(bc(&quot;research/asterism.rb&quot;))'
+
 ruby -Ilib -Itest -Iresearch -rex -e 'puts RedSun::ABC::ABCFile.yarv_to_string(@sc).inspect'
 
 irb -Ilib -Itest -Iresearch -rex</diff>
      <filename>ruby_cmds.sh</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>flash/src/FixNum.as</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>351f7d3fd883b4b829cc6689095dbc2abca5bf44</id>
    </parent>
  </parents>
  <author>
    <name>Jonathan Branam</name>
    <email>github@jonathanbranam.net</email>
  </author>
  <url>http://github.com/jonathanbranam/redsun/commit/287fcca03e2aeadc7897f1c7112b8997c0cdd8af</url>
  <id>287fcca03e2aeadc7897f1c7112b8997c0cdd8af</id>
  <committed-date>2008-10-31T13:51:57-07:00</committed-date>
  <authored-date>2008-10-31T13:51:57-07:00</authored-date>
  <message>Implementing instance vars and attr_* functions.
Prototypes for various libraries to demo at RubyConf.</message>
  <tree>eb6335cb5a11720a162fc58405d9989d29110502</tree>
  <committer>
    <name>Jonathan Branam</name>
    <email>github@jonathanbranam.net</email>
  </committer>
</commit>
