edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C615513
File: RubyTests.cs
===================================================================
--- $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C615513  (server)    10/27/2008 1:33 PM
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;IDO2
@@ -278,6 +278,8 @@
                 Scenario_RubyConsole3,
                 Scenario_RubyConsole4,
                 ObjectOperations1,
+                PythonInterop1,
+                PythonInterop2,
                 
                 Loader_Assemblies1,
 
===================================================================
edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/HostingTests.cs;C615513
File: HostingTests.cs
===================================================================
--- $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/HostingTests.cs;C615513  (server)    10/27/2008 10:52 AM
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/HostingTests.cs;IDO2
@@ -164,10 +164,45 @@
             var obj = Engine.Operations.Create(cls) as RubyObject;
             Debug.Assert(obj != null && obj.Class.Name == "C");
 
+            obj = Engine.Operations.InvokeMember(cls, "new") as RubyObject;
+            Debug.Assert(obj != null && obj.Class.Name == "C");
+
             var foo = Engine.Operations.GetMember(obj, "foo") as RubyMethod;
             Debug.Assert(foo != null && foo.Name == "foo" && foo.Target == obj);
 
             AssertOutput(() => Engine.Operations.Call(foo, 1, 2), "[1, 2]");
+            AssertOutput(() => Engine.Operations.InvokeMember(obj, "foo", 1, 2), "[1, 2]");
         }
+
+        public void PythonInterop1() {
+            var py = Runtime.GetEngine("python");
+            Engine.Execute(@"
+class C
+  def foo
+    puts 'foo'
+  end
+end
+");
+            // TODO: Python should not require SourceCodeKind.Statements
+            // TODO: Python should convert a call to CreateInstanceBinder
+            py.CreateScriptSourceFromString(@"
+import C
+C.new().foo()    # TODO: C().foo()
+", SourceCodeKind.Statements).Execute();
+        }
+
+        public void PythonInterop2() {
+            var py = Runtime.GetEngine("python");
+
+            py.CreateScriptSourceFromString(@"
+class C(object):
+  def foo(self):
+    print 'foo'
+", SourceCodeKind.Statements).Execute(Runtime.Globals);
+
+            Engine.Execute(@"
+p C             #TODO: C.new
+");
+        }
     }
 }
===================================================================
edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Ruby.csproj;C615513
File: Ruby.csproj
===================================================================
--- $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Ruby.csproj;C615513  (server)    10/27/2008 10:52 AM
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Ruby.csproj;IDO2
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.30718</ProductVersion>
+    <ProductVersion>9.0.30703</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{7F6984B4-EE6D-4E6F-ABB1-E210D7DC4FDD}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -166,6 +166,7 @@
     <Compile Include="Runtime\Calls\ArgsBuilder.cs" />
     <Compile Include="Runtime\Calls\CallArguments.cs" />
     <Compile Include="Runtime\Calls\BlockDispatcherUnsplatN.cs" />
+    <Compile Include="Runtime\Calls\RubyInvokeMemberBinder.cs" />
     <Compile Include="Runtime\Calls\MetaObjectBuilder.cs" />
     <Compile Include="Runtime\Calls\ProtocolConversionAction.cs" />
     <Compile Include="Runtime\Calls\RubyCallAction.cs" />
===================================================================
edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyClass.Meta.cs;C576154
File: RubyClass.Meta.cs
===================================================================
--- $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyClass.Meta.cs;C576154  (server)    10/27/2008 11:00 AM
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyClass.Meta.cs;IDO2
@@ -31,7 +31,15 @@
                 ContractUtils.RequiresNotNull(value, "value");
             }
 
-            // TODO: CreateInstance
+            public override MetaObject/*!*/ BindInvokeMemberl(InvokeMemberBinder/*!*/ binder, params MetaObject/*!*/[]/*!*/ args) {
+                var self = (RubyClass)Value;
+                return RubyInvokeMemberBinder.TryBind(self.Context, binder, this, args) ?? binder.FallbackInvokeMember(this, args);
+            }
+
+            public override MetaObject/*!*/ BindGetMember(GetMemberBinder/*!*/ binder) {
+                var self = (RubyClass)Value;
+                return RubyGetMemberBinder.TryBind(self.Context, binder, this) ?? binder.FallbackGetMember(this);
+            }
         }
     }
 }
===================================================================
edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyObject.Meta.cs;C615513
File: RubyObject.Meta.cs
===================================================================
--- $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyObject.Meta.cs;C615513  (server)    10/27/2008 10:52 AM
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyObject.Meta.cs;IDO2
@@ -35,6 +35,11 @@
                 var self = (RubyObject)Value;
                 return RubyGetMemberBinder.TryBind(self.Class.Context, binder, this) ?? binder.FallbackGetMember(this);
             }
+
+            public override MetaObject/*!*/ BindInvokeMemberl(InvokeMemberBinder/*!*/ binder, params MetaObject/*!*/[]/*!*/ args) {
+                var self = (RubyObject)Value;
+                return RubyInvokeMemberBinder.TryBind(self.Class.Context, binder, this, args) ?? binder.FallbackInvokeMember(this, args);
+            }
         }
     }
 }
===================================================================
edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs;C615513
File: RubyContext.cs
===================================================================
--- $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs;C615513  (server)    10/27/2008 10:52 AM
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs;IDO2
@@ -583,6 +583,14 @@
             return new RubyCreateInstanceBinder(this, arguments);
         }
 
+        public override InvokeMemberBinder/*!*/ CreateCallBinder(string/*!*/ name, bool ignoreCase, params ArgumentInfo[]/*!*/ arguments) {
+            if (RubyCallSignature.HasNamedArgument(arguments)) {
+                return base.CreateCallBinder(name, ignoreCase, arguments);
+            }
+
+            return new RubyInvokeMemberBinder(this, name, arguments);
+        }
+
         #endregion
 
         #region Interpretation
===================================================================
edit: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyCallAction.cs;C615513
add: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyInvokeMemberBinder.cs
File: RubyInvokeMemberBinder.cs
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vsl_dynamic/Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyInvokeMemberBinder.cs;IDO2
@@ -1,0 +1,85 @@
+?/* ****************************************************************************
+ *
+ * Copyright (c) Microsoft Corporation. 
+ *
+ * This source code is subject to terms and conditions of the Microsoft Public License. A 
+ * copy of the license can be found in the License.html file at the root of this distribution. If 
+ * you cannot locate the  Microsoft Public License, please send an email to 
+ * ironruby@microsoft.com. By using this source code in any fashion, you are agreeing to be bound 
+ * by the terms of the Microsoft Public License.
+ *
+ * You must not remove this notice, or any other, from this software.
+ *
+ *
+ * ***************************************************************************/
+
+using System;
+using System.Linq.Expressions;
+using System.Scripting.Actions;
+using Microsoft.Scripting;
+using Microsoft.Scripting.Actions;
+using Microsoft.Scripting.Runtime;
+using Microsoft.Scripting.Utils;
+using IronRuby.Compiler;
+using IronRuby.Builtins;
+
+namespace IronRuby.Runtime.Calls {
+    using Ast = System.Linq.Expressions.Expression;
+
+    internal sealed class RubyInvokeMemberBinder : InvokeMemberBinder {
+        private readonly RubyContext/*!*/ _context;
+
+        public RubyInvokeMemberBinder(RubyContext/*!*/ context, string/*!*/ name, ArgumentInfo[]/*!*/ arguments)
+            : base(name, false, arguments) {
+            _context = context;
+        }
+
+        public override object CacheIdentity {
+            get { return this; }
+        }
+
+        public override MetaObject/*!*/ FallbackInvoke(MetaObject/*!*/ self, MetaObject/*!*/[]/*!*/ args, MetaObject/*!*/ onBindingError) {
+            var result = TryBind(_context, this, self, args);
+            if (result != null) {
+                return result;
+            }
+
+            // TODO: return ((DefaultBinder)_context.Binder).GetMember(Name, self, Ast.Null(typeof(CodeContext)), true);
+            throw new NotImplementedException();
+        }
+
+        public override MetaObject/*!*/ FallbackInvokeMember(MetaObject/*!*/ self, MetaObject/*!*/[]/*!*/ args, MetaObject/*!*/ onBindingError) {
+            var result = TryBind(_context, this, self, args);
+            if (result != null) {
+                return result;
+            }
+
+            // TODO: return ((DefaultBinder)_context.Binder).GetMember(Name, self, Ast.Null(typeof(CodeContext)), true);
+            throw new NotImplementedException();
+        }
+
+        public static MetaObject TryBind(RubyContext/*!*/ context, InvokeMemberBinder/*!*/ binder, 
+            MetaObject/*!*/ target, MetaObject/*!*/[]/*!*/ args) {
+
+            Assert.NotNull(context, target);
+            var metaBuilder = new MetaObjectBuilder();
+            var ec = context.ExecutionContext;
+            var codeContextExpression = Ast.Constant(context.EmptyContext);
+
+            MetaObject codeContext = new MetaObject(
+                Ast.Constant(context.EmptyContext),
+                Restrictions.Empty,
+                context.EmptyContext
+            );
+
+            args = ArrayUtils.Insert(codeContext, target, args);
+
+            RubyCallAction.Bind(metaBuilder, binder.Name, 
+                new CallArguments(args, RubyCallSignature.Simple(binder.Arguments.Count))
+            );
+
+            // TODO: we should return null if we fail, we need to throw exception for now:
+            return metaBuilder.CreateMetaObject(binder, MetaObject.EmptyMetaObjects);
+        }
+    }
+}
===================================================================
