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
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.
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: