From: "trans (Thomas Sawyer)" Date: 2012-10-28T06:39:48+09:00 Subject: [ruby-core:48500] [ruby-trunk - Feature #6609] Toplevel as self extended module Issue #6609 has been updated by trans (Thomas Sawyer). > We thought your slide included multiple requests. Basically there were only two. It might seem like more b/c it is comprehensive in scope, covering many details in one go, i.e. Toplevel as a self extended module would provide #define_method, #const_defined?, #instance_methods, etc. The only request separate from this is for a non-polluting toplevel. > Matz rejected "module Main". He said that "Toplevel pollution" (you are > saying) is actually designed. I would like to understand this design then. In my experience it has only served to limit what I can achieve, and gained me no additional benefit. > - Matz accepted "define_method in Toplevel". We need a patch. Nobu, could you? > > - Matz rejected "const_defined? in Toplevel". He said he couldn't understand > why it is needed. > > - If you want another method, please propose them individually. That really misses the point. Oh well. ---------------------------------------- Feature #6609: Toplevel as self extended module https://bugs.ruby-lang.org/issues/6609#change-31831 Author: trans (Thomas Sawyer) Status: Assigned Priority: Normal Assignee: nobu (Nobuyoshi Nakada) Category: core Target version: 2.0.0 As promised sometime back here is my proposal that Toplevel object become a self-extended module instead of the current partial Object class proxy. I have written about it in a blog post: http://trans.github.com/2012/06/17/kill-the-proxy-and-save-toplevel.html In summary the basic idea is to have a special toplevel namespace that is self-extended, e.g. module Toplevel extend self end in which all toplevel code is evaluated. Definitions at the toplevel would no longer inject into Object class. This frees up the toplevel to be used for general purpose DSL "batch" scripting. What I mean by that is that one can create a DSL, load it in to toplevel and then evaluate scripts based on it simply by load/require and without fret that the code loaded in will infect Object if it defines it's own methods. Conceptually the idea of self-extended module is much simpler than current proxy object --there is really nothing special to understand about it since it is just a module like any other module. With regard to backward compatibility, the only programs that would be effected are any that defined a toplevel method fully expecting it to add a method to Object. But those will be very rare since it is generally considered bad form to do that. (And of course the simple fix is to wrap the method in the proper `class Object private ... end` code. -- http://bugs.ruby-lang.org/