> Since there still remain undefined corner case behavior in refinements, and the time is running out, I decided not to introduce full refinement for Ruby 2.0. The limited Ruby 2.0 refinement spec will be:
>
> * refinements are file scope
> * only top-level "using" is available
> * no module scope refinement
> * no refinement inheritance
> * module_eval do not introduce refinement (even for string args)

While this removes a number of potential causes of problems we're now 
stuck with a feature-set that can not cover many of the originally 
discussed use-cases.

And to support the restricted feature set we already have disagreements 
where refinements should be injected in the method hierarchy. What is 
labled as a "design decision" aren't even edge cases anymore. They're 
essential behavior of a new feature decided without much discussion or 
analysis in the context of potential uses.

For DSLs we already have BasicObject + method_missing + instance_eval, 
so only ruby literals may need some sugar added to make the DSL really 
fluent. But if you already have all the instance_eval magic going then 
you don't really want to require people to pepper their code with 
"using" just so they can use your magical DSL.

For patching broken/incompatible code Module.prepend is much better 
anyway since the breakage may occur in 3rd party code where you can't 
use "using" anyway.

So with what does this leave us? String.camelize and 2.days.ago? Those 
are supposed to be convenience methods.

If your files end up with a header of

   using "EnumeratorExtensions", "ActiveSupport::ClassNameConversions", 
"MyApplication::DateHelpers", "SomeGem::HashExtensions", 
"MyApplication::ActiveRecordExtensions", .......

That's not convenient at all anymore.


Personally I wouldn't want to use refinements as they are now. I would 
love to have a powerful tool like pointcuts or Module.prepend in my 
toolbox. Refinements wouldn't really qualify.


I'm getting the impression that refinements are getting rushed despite 
being supposed to bring a completely new axis to the language along 
which we can compose our applications. This shouldn't be happening in a 
mature language. The whole way this is going right now feels wrong to me.

So I'm asking for two things: a) please consider removing refinements 
from ruby 2.0. b) rethink how such big features should be designed in 
the future.