Skip to content

Commit 7db73eb

Browse files
hsbtclaude
andcommitted
Use bind_call instead of define_method to preserve require visibility
Kernel.define_method(:require, ...) makes require public, breaking the spec that checks Kernel#require is a private method. Using bind_call avoids mutating Kernel entirely. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3bb2f69 commit 7db73eb

1 file changed

Lines changed: 4 additions & 12 deletions

File tree

gem_prelude.rb

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,10 @@ module Exception::DetailedMessage # :nodoc:
3131
def detailed_message(...)
3232
gem_above = self.class.instance_method(:detailed_message).owner != Exception::DetailedMessage
3333

34-
# Temporarily restore the original require to bypass any user
35-
# monkeypatching during gem loading (including nested requires).
36-
orig = Exception::DetailedMessage.instance_variable_get(:@require)
37-
patched = Kernel.instance_method(:require)
38-
Kernel.define_method(:require, orig)
39-
begin
40-
require 'error_highlight' rescue LoadError
41-
require 'did_you_mean' rescue LoadError
42-
require 'syntax_suggest' rescue LoadError
43-
ensure
44-
Kernel.define_method(:require, patched)
45-
end
34+
req = Exception::DetailedMessage.instance_variable_get(:@require)
35+
begin; req.bind_call(self, 'error_highlight'); rescue LoadError; end
36+
begin; req.bind_call(self, 'did_you_mean'); rescue LoadError; end
37+
begin; req.bind_call(self, 'syntax_suggest'); rescue LoadError; end
4638

4739
Exception::DetailedMessage.remove_method(:detailed_message)
4840
gem_above ? super : detailed_message(...)

0 commit comments

Comments
 (0)