<div class="markdown">
<p dir="auto">Hi guys and gals,</p>

<p dir="auto">I'm sure this is an elementary problem, but my recent discovery and subsequent love of Ara Howard's "main"<a href="https://github.com/ahoward/main">1</a> got me digging through its source code to help advance my basic Ruby knowledge.</p>

<p dir="auto">I wondered how main's DSL was created. For example, the main wrapper is called as:</p>

<pre><code>Main {
    # code here
}
</code></pre>

<p dir="auto">It seemed obvious to me that it was a method called Main that accepted a block, but I wondered about how exactly it was defined. It turns out the definition is:</p>

<pre><code>module Kernel
private
  def Main(*args, &block)
    # code here
  end
end
</code></pre>

<p dir="auto">Now I understand what the Kernel module is (it's mixed into every object, so its methods are global? Correct me if I'm wrong!), and I understand the implications of adding a private method to Kernel (it can only be called as <code>Kernel.foo</code> or totally unprefixed, it doesn't show up as a method on all objects?).</p>

<p dir="auto">But what's the difference between doing this versus just doing:</p>

<pre><code>def Main(*args, &block)
    # code here
end
</code></pre>

<p dir="auto">Surely both ways end up with a global method that's callable from everywhere? Why jump through the hoop of mixing-in to Kernel? Are there any advantages?</p>

<p dir="auto">Is this some scope-related problem, linked to the fact that he defines a module called Main also (so he couldn't defined a method with the same name)?</p>

<p dir="auto">Best,<br>
Rob</p>

</div>