edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C853491
File: RubyTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C853491  (server)    5/5/2009 12:30 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;ToProc1
@@ -228,6 +228,7 @@
                 RubyProcArgConversion4,
                 ProcNew1,
                 ProcNew2,
+                MethodToProc1,
                 DefineMethod1,
                 DefineMethod2,
                 
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/BlockTests.cs;C853491
File: BlockTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/BlockTests.cs;C853491  (server)    5/5/2009 12:24 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/BlockTests.cs;ToProc1
@@ -1065,6 +1065,44 @@
 ");
         }
 
+        public void MethodToProc1() {
+            AssertOutput(() => CompilerTest(@"
+class C
+  def foo a, b=2, *args
+    p self, a, b, args
+    123
+  end
+end
+
+class D < C
+end
+
+x = 'hello'
+q = C.new.method(:foo).to_proc
+p q[1]
+p q[] rescue p $!
+
+# to_proc captures the caller's binding:
+eval('puts x, self', q.binding)
+
+p D.new.instance_eval(&q)
+"), @"
+#<C:0x*>
+1
+2
+[]
+123
+#<ArgumentError: wrong number of arguments (0 for 1)>
+hello
+main
+#<C:0x*>
+#<D:0x*>
+2
+[]
+123
+", OutputFlags.Match);
+        }
+
         public void DefineMethod1() {
             AssertOutput(delegate() {
                 CompilerTest(@"
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C846590
File: Initializers.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C846590  (server)    5/5/2009 11:48 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;ToProc1
@@ -3424,7 +3424,7 @@
             );
             
             module.DefineLibraryMethod("to_proc", 0x51, 
-                new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyMethod, IronRuby.Builtins.Proc>(IronRuby.Builtins.MethodOps.ToProc)
+                new System.Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.RubyMethod, IronRuby.Builtins.Proc>(IronRuby.Builtins.MethodOps.ToProc)
             );
             
             module.DefineLibraryMethod("to_s", 0x51, 
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MethodOps.cs;C705576
File: MethodOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MethodOps.cs;C705576  (server)    5/5/2009 10:40 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MethodOps.cs;ToProc1
@@ -57,13 +57,8 @@
         }
 
         [RubyMethod("to_proc")]
-        public static Proc/*!*/ ToProc(RubyContext/*!*/ context, RubyMethod/*!*/ self) {
-            RubyMethodInfo mi = self.Info as RubyMethodInfo;
-            if (mi != null) {
-                return Proc.Create(context, mi.Method, self.Target, mi.GetArity());
-            }
-            // TODO: figure out what the semantics should be for a set of CLR methods returned ...
-            throw new NotImplementedException();
+        public static Proc/*!*/ ToProc(RubyScope/*!*/ scope, RubyMethod/*!*/ self) {
+            return self.ToProc(scope);
         }
 
         [RubyMethod("unbind")]
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/Proc.cs;C790584
File: Proc.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/Proc.cs;C790584  (server)    5/5/2009 10:28 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/Proc.cs;ToProc1
@@ -257,7 +257,6 @@
 
         #region Block helper methods
 
-        // TODO: remove context, rename to CreateBlock
         public static Proc/*!*/ Create(RubyContext/*!*/ context, Func<BlockParam, object, object>/*!*/ clrMethod) {
             return Create(context, (BlockCallTarget1)BlockCallback1, clrMethod, 1);
         }
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyMethod.cs;C790584
File: RubyMethod.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyMethod.cs;C790584  (server)    5/5/2009 11:36 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyMethod.cs;ToProc1
@@ -13,7 +13,9 @@
  *
  * ***************************************************************************/
 
+using System;
 using System.Diagnostics;
+using System.Runtime.CompilerServices;
 using IronRuby.Runtime;
 using IronRuby.Runtime.Calls;
 using Microsoft.Scripting.Utils;
@@ -26,6 +28,7 @@
         private readonly object _target;
         private readonly string/*!*/ _name;
         private readonly RubyMemberInfo/*!*/ _info;
+        private BlockDispatcherUnsplatN _procDispatcher;
 
         public object Target {
             get { return _target; }
@@ -52,6 +55,31 @@
             return _info.Context.GetClassOf(_target);
         }
 
+        public Proc/*!*/ ToProc(RubyScope/*!*/ scope) {
+            ContractUtils.RequiresNotNull(scope, "scope");
+
+            if (_procDispatcher == null) {
+                var site = CallSite<Func<CallSite, object, object, object>>.Create(
+                    // TODO: use InvokeBinder
+                    RubyCallAction.Make(
+                        scope.RubyContext, "call",
+                        new RubyCallSignature(1, RubyCallFlags.HasImplicitSelf | RubyCallFlags.HasSplattedArgument)
+                    )
+                );
+
+                var block = new BlockCallTargetUnsplatN((_blockParam, _self, _args, unsplat) => {
+                    // block takes no parameters but unsplat => all actual arguments are added to unsplat:
+                    Debug.Assert(_args.Length == 0);
+
+                    return site.Target(site, this, unsplat);
+                });
+
+                _procDispatcher = new BlockDispatcherUnsplatN(block, 0, BlockSignatureAttributes.HasUnsplatParameter);
+            }
+
+            return new Proc(ProcKind.Block, scope.SelfObject, scope, _procDispatcher);
+        }
+
         #region Dynamic Operations
 
         internal void BuildInvoke(MetaObjectBuilder/*!*/ metaBuilder, CallArguments/*!*/ args) {
===================================================================
