Library method isolation

Dear gurus,

I often add utility methods to Hash, Enumerable, etc. For applications
this is fine, but for a library, I feel like I should avoid leaving such
"method detritus" around in users' namespaces.

Is there a way to extend/modify existing classes or modules only within
the context of a particular ("library") module?

My first idea had some problems:

module Library

  class Hash < ::Hash
    def extramethod
      # ...
    end
  end

  Hash.new.extramethod # fine
  {}.extramethod # problem, but I can work around
  [1,2,3].map { |x| x + 1 }.extramethod # big problem

end

How do others deal with this?

Thanks for any insight,

···

--
William <wmorgan-ruby-talk@masanjin.net>

William Morgan wrote:

Dear gurus,

I often add utility methods to Hash, Enumerable, etc. For

applications

this is fine, but for a library, I feel like I should avoid leaving

such

"method detritus" around in users' namespaces.

I think your looking for selector namespaces. This is planned for Ruby
2.0.

Google will turn up more info.

(...)

Is there a way to extend/modify existing classes or modules only

within

the context of a particular ("library") module?

(...)

How do others deal with this?

Not sure how people are currently dealing with this issue, other than
ignoring it...

-Charlie

Excerpts from Charles Mills's mail of 7 Jan 2005 (EST):

> I often add utility methods to Hash, Enumerable, etc. For
> applications this is fine, but for a library, I feel like I should
> avoid leaving such "method detritus" around in users' namespaces.

I think your looking for selector namespaces. This is planned for
Ruby 2.0. http://rubygarden.org/ruby?Rite

Thanks. That would certainly solve this issue. The wiki page mentions
something about Ruby libraries that implement selector namespaces; I
wonder if the author of that statement had something specific in mind or
whether it was just a rhetorical device....

In the mean time, I've been moving all utility methods into modules and
making liberal use of 'extend' like so:

  hash = @array.map { |x| trans(x) }.extend(HashUtil).utilfunc

which is irritating, and unnecessarily slow, and doesn't work in all
cases, but is sufficient for the purposes of namespace purity. :slight_smile:

Thanks for your help,

···

--
William <wmorgan-ruby-talk@masanjin.net>