diff --git a/lib/rb/ext/struct.c b/lib/rb/ext/struct.c
index fee285e..31c62d5 100644
--- a/lib/rb/ext/struct.c
+++ b/lib/rb/ext/struct.c
@@ -45,28 +45,28 @@
 
 static native_proto_method_table *mt;
 static native_proto_method_table *default_mt;
-static VALUE last_proto_class = Qnil;
+// static VALUE last_proto_class = Qnil;
 
 #define IS_CONTAINER(ttype) ((ttype) == TTYPE_MAP || (ttype) == TTYPE_LIST || (ttype) == TTYPE_SET)
 #define STRUCT_FIELDS(obj) rb_const_get(CLASS_OF(obj), fields_const_id)
 
-static void set_native_proto_function_pointers(VALUE protocol) {
-  VALUE method_table_object = rb_const_get(CLASS_OF(protocol), rb_intern("@native_method_table"));
-  // TODO: check nil?
-  Data_Get_Struct(method_table_object, native_proto_method_table, mt);
-}
+// static void set_native_proto_function_pointers(VALUE protocol) {
+//   VALUE method_table_object = rb_const_get(CLASS_OF(protocol), rb_intern("@native_method_table"));
+//   // TODO: check nil?
+//   Data_Get_Struct(method_table_object, native_proto_method_table, mt);
+// }
 
-static void check_native_proto_method_table(VALUE protocol) {
-  VALUE protoclass = CLASS_OF(protocol);
-  if (protoclass != last_proto_class) {
-    last_proto_class = protoclass;
-    if (rb_funcall(protocol, native_qmark_method_id, 0) == Qtrue) {
-      set_native_proto_function_pointers(protocol);
-    } else {
-      mt = default_mt;
-    }
-  }
-}
+// static void check_native_proto_method_table(VALUE protocol) {
+//   VALUE protoclass = CLASS_OF(protocol);
+//   if (protoclass != last_proto_class) {
+//     last_proto_class = protoclass;
+//     if (rb_funcall(protocol, native_qmark_method_id, 0) == Qtrue) {
+//       set_native_proto_function_pointers(protocol);
+//     } else {
+//       mt = default_mt;
+//     }
+//   }
+// }
 
 //-------------------------------------------
 // Writing section
@@ -416,16 +416,16 @@
   // call validate
   rb_funcall(self, validate_method_id, 0);
 
-  check_native_proto_method_table(protocol);
-  
+  // check_native_proto_method_table(protocol);
+
   // write struct begin
   mt->write_struct_begin(protocol, rb_class_name(CLASS_OF(self)));
-  
+
   // iterate through all the fields here
   VALUE struct_fields = STRUCT_FIELDS(self);
   VALUE struct_field_ids_unordered = rb_funcall(struct_fields, keys_method_id, 0);
   VALUE struct_field_ids_ordered = rb_funcall(struct_field_ids_unordered, sort_method_id, 0);
-  
+
   int i = 0;
   for (i=0; i < RARRAY_LEN(struct_field_ids_ordered); i++) {
     VALUE field_id = rb_ary_entry(struct_field_ids_ordered, i);
@@ -444,12 +444,12 @@
       mt->write_field_end(protocol);
     }
   }
-  
+
   mt->write_field_stop(protocol);
-  
+
   // write struct end
   mt->write_struct_end(protocol);
-  
+
   return Qnil;
 }
 
@@ -470,7 +470,7 @@
 
 static VALUE read_anything(VALUE protocol, int ttype, VALUE field_info) {
   VALUE result = Qnil;
-  
+
   if (ttype == TTYPE_BOOL) {
     result = mt->read_bool(protocol);
   } else if (ttype == TTYPE_BYTE) {
@@ -496,21 +496,21 @@
     int key_ttype = FIX2INT(rb_ary_entry(map_header, 0));
     int value_ttype = FIX2INT(rb_ary_entry(map_header, 1));
     int num_entries = FIX2INT(rb_ary_entry(map_header, 2));
-    
+
     VALUE key_info = rb_hash_aref(field_info, key_sym);
     VALUE value_info = rb_hash_aref(field_info, value_sym);
 
     result = rb_hash_new();
-    
+
     for (i = 0; i < num_entries; ++i) {
       VALUE key, val;
-      
+
       key = read_anything(protocol, key_ttype, key_info);
       val = read_anything(protocol, value_ttype, value_info);
-      
+
       rb_hash_aset(result, key, val);
     }
-    
+
     mt->read_map_end(protocol);
   } else if (ttype == TTYPE_LIST) {
     int i;
@@ -519,7 +519,7 @@
     int element_ttype = FIX2INT(rb_ary_entry(list_header, 0));
     int num_elements = FIX2INT(rb_ary_entry(list_header, 1));
     result = rb_ary_new2(num_elements);
-    
+
     for (i = 0; i < num_elements; ++i) {
       rb_ary_push(result, read_anything(protocol, element_ttype, rb_hash_aref(field_info, element_sym)));
     }
@@ -534,36 +534,36 @@
     int element_ttype = FIX2INT(rb_ary_entry(set_header, 0));
     int num_elements = FIX2INT(rb_ary_entry(set_header, 1));
     items = rb_ary_new2(num_elements);
-    
+
     for (i = 0; i < num_elements; ++i) {
       rb_ary_push(items, read_anything(protocol, element_ttype, rb_hash_aref(field_info, element_sym)));
     }
-    
+
 
     mt->read_set_end(protocol);
-    
+
     result = rb_class_new_instance(1, &items, rb_cSet);
   } else {
     rb_raise(rb_eNotImpError, "read_anything not implemented for type %d!", ttype);
   }
-  
+
   return result;
 }
 
 static VALUE rb_thrift_struct_read(VALUE self, VALUE protocol) {
-  check_native_proto_method_table(protocol);
-  
+  // check_native_proto_method_table(protocol);
+
   // read struct begin
   mt->read_struct_begin(protocol);
 
   VALUE struct_fields = STRUCT_FIELDS(self);
-  
+
   // read each field
   while (true) {
     VALUE field_header = mt->read_field_begin(protocol);
     VALUE field_type_value = rb_ary_entry(field_header, 1);
     int field_type = FIX2INT(field_type_value);
-    
+
     if (field_type == TTYPE_STOP) {
       break;
     }
@@ -583,23 +583,24 @@
     } else {
       rb_funcall(protocol, skip_method_id, 1, field_type_value);
     }
-    
+
     // read field end
     mt->read_field_end(protocol);
   }
-  
+
   // read struct end
   mt->read_struct_end(protocol);
-  
+
   return Qnil;
 }
 
 void Init_struct() {
   VALUE struct_module = rb_const_get(thrift_module, rb_intern("Struct"));
-  
+
   rb_define_method(struct_module, "write", rb_thrift_struct_write, 1);
   rb_define_method(struct_module, "read", rb_thrift_struct_read, 1);
-  
+
   set_default_proto_function_pointers();
+  mt = default_mt;
 }
 
