anchor.diff:  // Abaci classes dont need a mark function because they do not contain references to other Ruby objects.
   // Currently Abaci classes are allocated off of the C++ heap.
   
  +#define GET_LONG(name) long name##_long = NUM2LONG(name);
  +
  +//
  +// Vector2
  +//
  +
   inline Vector2d* GetVector2(VALUE data)
   {
   	Vector2d* vec;
  
positive.code: 
  	CMethod.noargs_self('Vector2', 'SetZero', 'zero!'),
  
  	CMethod.new('set', 'set', ['x', 'y'], <<-CODE),
  	    GET_VECTOR2(self);
  		self_vec->Set(NUM2DBL(x), NUM2DBL(y));
  	    return self;
  	CODE
  
  	CMethod.new('get_elem', '[]', ['index'], <<-CODE),
  	    GET_VECTOR2(self);
  	    GET_LONG(index);
  		if (index_long < 0 || index_long >= 2)
  		    rb_raise(rb_eRuntimeError, "index out of range");
  		return rb_float_new((*self_vec)[index_long]);
  	CODE
  
  	CMethod.new('set_elem', '[]=', ['index', 'value'], <<-CODE),
  	    GET_VECTOR2(self);
  	    GET_LONG(index);
  		if (index_long < 0 || index_long >= 2)
  		    rb_raise(rb_eRuntimeError, "index out of range");
  		(*self_vec)[index_long] = NUM2DBL(value);
  		return value;
  	CODE
  
  	CMethod.new('dot', 'dot', ['other'], <<-CODE),
  	    GET_VECTOR2(self);
  
negative.code: 	   not_a_klass_code = "*result_vec = *self_vec #{c_op} NUM2DBL(other);"
  	end
  	new(c_name, rb_name, ['other'], <<-CODE)
  		GET_#{klass.upcase}(self);
  		NEW_#{klass.upcase}(result);
  		if (TYPE(other) == T_DATA && RDATA(other)->dfree == (RUBY_DATA_FUNC)#{klass.downcase}_free)
  		{
  			GET_#{klass.upcase}(other);
  	    	*result_vec = *self_vec #{c_op} *other_vec;
  		}
  		else
  