library method isolation

W

William Morgan

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,
 
C

Charles Mills

William said:
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.
http://rubygarden.org/ruby?Rite
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
 
W

William Morgan

Excerpts from Charles Mills's mail of 7 Jan 2005 (EST):
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. :)

Thanks for your help,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,164
Messages
2,570,898
Members
47,439
Latest member
shasuze

Latest Threads

Top