diff --git a/shotgun/lib/subtend/ruby.c b/shotgun/lib/subtend/ruby.c
index 5a9ca63..07d033d 100644
--- a/shotgun/lib/subtend/ruby.c
+++ b/shotgun/lib/subtend/ruby.c
@@ -309,6 +309,20 @@ VALUE rb_iv_set(VALUE obj, char *name, VALUE val) {
   return rb_ivar_set(obj, rb_intern(name), val);
 }

+
+VALUE rb_ivar_defined(VALUE obj, ID sym) {
+  CTX;
+
+  if(object_has_ivars(ctx->state, HNDL(obj))) {
+    if (object_get_ivar(ctx->state, HNDL(obj), HNDL(sym)) != Qundef) {
+      return Qtrue;
+    }
+  }
+
+  return Qfalse;
+}
+
+
 void rb_define_method_(const char *file, VALUE vmod, const char *name, void *func, int args, int kind) {
   OBJECT meth, sym, mod;
   CTX;
@@ -467,6 +481,14 @@ VALUE rb_class_new_instance(int nargs, VALUE *args, VALUE klass) {
   return obj;
 }

+VALUE rb_singleton_class(VALUE obj) {
+  OBJECT val;
+  CTX;
+  
+  val = object_metaclass(ctx->state, HNDL(obj));
+  return NEW_HANDLE(ctx, val);
+}
+
 void rb_thread_schedule() {
   rb_funcall2(rb_const_get(rb_cObject, rb_intern("Thread")), rb_intern("pass"), 0, NULL);
 }
@@ -515,6 +537,9 @@ VALUE rb_ary_new(void) {
   return rb_ary_new2(ARRAY_DEFAULT_SIZE);
 }

+VALUE OBJ_TAINT(VALUE val) { return val; }
+int OBJ_TAINTED(VALUE val) { return 0; }
+
 VALUE rb_ary_new2(long length) {
   OBJECT ary;
   CTX;
@@ -524,6 +549,24 @@ VALUE rb_ary_new2(long length) {
   return NEW_HANDLE(ctx, ary);
 }

+VALUE rb_ary_new3(long length, ...) {
+  OBJECT ary;
+  CTX;
+
+  va_list ar;
+  long i;
+
+  ary = array_new(ctx->state, length);
+
+  va_start(ar, length);
+  for(i = 0; i < length; i++) {
+    array_append(ctx->state, ary, HNDL(va_arg(ar, VALUE)));
+  }
+  va_end(ar);
+
+  return NEW_HANDLE(ctx, ary);
+}
+
 VALUE rb_ary_push(VALUE array, VALUE val) {
   CTX;
   OBJECT ary = HNDL(array);
diff --git a/shotgun/lib/subtend/ruby.h b/shotgun/lib/subtend/ruby.h
index 532bc88..22ef728 100644
--- a/shotgun/lib/subtend/ruby.h
+++ b/shotgun/lib/subtend/ruby.h
@@ -76,6 +76,8 @@ VALUE rb_ivar_get(VALUE obj, ID sym);
 VALUE rb_iv_get(VALUE obj, char *name);
 VALUE rb_ivar_set(VALUE obj, ID sym, VALUE val);
 VALUE rb_iv_set(VALUE obj, char *name, VALUE val);
+VALUE rb_ivar_defined(VALUE obj, ID sym);
+
 void rb_define_attr(VALUE klass, const char* id, int read, int write);
 VALUE rb_attr_get(VALUE obj, ID sym);

@@ -182,6 +184,7 @@ VALUE INT2NUM(int num);
 VALUE rb_Array(VALUE val);
 VALUE rb_ary_new(void);
 VALUE rb_ary_new2(long length);
+VALUE rb_ary_new3(long length, ...);
 int rb_ary_size(VALUE self);
 VALUE rb_ary_push(VALUE array, VALUE val);
 VALUE rb_ary_pop(VALUE array);