ctx
Tired of waiting for refinements in ruby 2.0?
Or something like it?
Me, too.
So, this.
Example
Here, figure it out:
require 'ctx'
class ::String
ctx :reversaroo do
def +(other)
"#{other.reverse}#{self.reverse}"
end
end
ctx :camels do
def +(other)
"#{self.capitalize}#{other.capitalize}"
end
end
ctx :polite do
def +(other)
"I say, good day to you there '#{other}', may I introduce you to my good friend '#{self}'?"
end
end
ctx do
def +(other)
"#{self} + #{other} = ?"
end
end
end
puts "hello" + "world"
#=> helloworld
ctx :camels do
puts "hello" + "world"
#=> HelloWorld
ctx :polite do
puts "hello" + "world"
#=> I say, good day to you there 'world', may I introduce you to my good friend 'hello'?
end
ctx do
puts "hello" + "world"
#=> hello + world = ?
end
end
ctx :reversaroo do
puts "hello" + "world"
#=> dlrowolleh
end
puts "hello" + "world"
#=> helloworld
There are bugs. You'll find them.
Caveats and such
For whatever reason, this stuff doesn't play well with rspec all the time, particularly if you override stuff the matchers are hoping to also override, like == or =~ on String, who knew?
So, don't do that.
...not unless you like stuff to break in inexplicable ways.
Personally, I do like things breaking in inexplicable ways (why else would I write things like this?) since makes life interesting (also kind of explains my dating choices, when you get right down to it), but, honestly, it's your call.