From: marcandre-ruby-core@... Date: 2020-12-09T04:31:11+00:00 Subject: [ruby-core:101326] [Ruby master Feature#17380] Useful `include/prepend` in `refine` Issue #17380 has been reported by marcandre (Marc-Andre Lafortune). ---------------------------------------- Feature #17380: Useful `include/prepend` in `refine` https://bugs.ruby-lang.org/issues/17380 * Author: marcandre (Marc-Andre Lafortune) * Status: Open * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) ---------------------------------------- Currently, `prepend/include` within a `refine` block leads to a method not being to see itself, or others defined in the same module: ```ruby module Code def recurse(value = nil) return value if value recurse(42) # => NoMethodError!!! end end module Extension refine Object do include Code end end using Extension :x.recurse(:y) # => :y (ok) :x.recurse # => NoMethodError, was hoping for 42 ``` I find this unintuitive and not useful. The conclusion of the current situation from @shugo and others is ["I don't recommend module inclusion to define refined methods"](https://bugs.ruby-lang.org/issues/17374#note-9) Could we change this situation so it can be recommended to use it? What I believe would be more useful and is what I expected was that `include/prepend` within a `Module` would bring in the current methods in the Module, with the current refinements activated. One use-case in particular is to publish libraries where one can give the option to the user to either: - call `using GreatExtension` in each and every file that need it - or `MyClass.prepend GreatExtension` once. While [Jeremy Evans found a way to do it](https://bugs.ruby-lang.org/issues/17374#note-8), it remains challenging and unnatural. -- https://bugs.ruby-lang.org/ Unsubscribe: