Index: ModuleOps.cs
===================================================================
--- ModuleOps.cs	(revision 93)
+++ ModuleOps.cs	(working copy)
@@ -108,6 +108,14 @@
         #region extend_object, extended // TODO
 
         //  extend_object
+        [RubyMethod("extend_object")]
+        public static object ExtendObject(CodeContext/*!*/ context, RubyModule/*!*/ self, object other)
+        {
+            RubyClass singleton = RubyUtils.GetExecutionContext(context).CreateSingletonClass(other);
+            singleton.IncludeModules(self);
+            return other;
+        }
+
         //  extended
 
         #endregion
@@ -198,15 +206,35 @@
         #endregion
 
         //  module_function
-        
+
         [RubyMethod("define_method", RubyMethodAttributes.PrivateInstance)]
-        public static Proc/*!*/ DefineMethod(CodeContext/*!*/ context, RubyModule/*!*/ self, BlockParam/*!*/ block, SymbolId methodName) {
+        public static Proc/*!*/ DefineMethod(CodeContext/*!*/ context, RubyModule/*!*/ self, object methodStr, Proc proc) {
+            SymbolId methodName = new SymbolId();
+            if (methodStr is SymbolId)
+                methodName = (SymbolId)methodStr;
+            else
+                methodName = SymbolTable.StringToId(methodStr.ToString());
+
+            RubyScope scope = RubyUtils.GetScope(context);
+            Proc lambda = proc.ToLambda();
+            self.SetMethod(methodName, Proc.ToLambdaMethodInfo(lambda, scope.Visibility, self));
+            return lambda;
+        }
+
+        [RubyMethod("define_method", RubyMethodAttributes.PrivateInstance)]
+        public static Proc/*!*/ DefineMethod(CodeContext/*!*/ context, RubyModule/*!*/ self, BlockParam/*!*/ block, object methodStr) {   // orig
             // TODO: [NotNull] attribute should work for BlockParams but doesn't
             
             if (block == null) {
                 throw RubyExceptions.CreateArgumentError("tried to create Proc object without a block");
             }
 
+            SymbolId methodName = new SymbolId();
+            if (methodStr is SymbolId)
+                methodName = (SymbolId)methodStr;
+            else
+                methodName = SymbolTable.StringToId(methodStr.ToString());
+
             RubyScope scope = RubyUtils.GetScope(context);
             Proc lambda = block.Proc.ToLambda();
             self.SetMethod(methodName, Proc.ToLambdaMethodInfo(lambda, scope.Visibility, self));
@@ -214,6 +242,12 @@
         }
 
         //  method_added
+        [RubyMethod("method_added")]
+        public static void MethodAdded(CodeContext/*!*/ context, RubyModule/*!*/ self, SymbolId/*!*/ id) {
+            // dummy
+            return;
+        }
+
         //  method_removed
         //  method_undefined
 
