summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/irb/helper_method/base.rb4
-rw-r--r--lib/irb/workspace.rb2
-rw-r--r--test/irb/test_helper_method.rb31
3 files changed, 33 insertions, 4 deletions
diff --git a/lib/irb/helper_method/base.rb b/lib/irb/helper_method/base.rb
index dc74b046da..a68001ed28 100644
--- a/lib/irb/helper_method/base.rb
+++ b/lib/irb/helper_method/base.rb
@@ -1,6 +1,10 @@
+require "singleton"
+
module IRB
module HelperMethod
class Base
+ include Singleton
+
class << self
def description(description = nil)
@description = description if description
diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb
index dd92d99014..d24d1cc38d 100644
--- a/lib/irb/workspace.rb
+++ b/lib/irb/workspace.rb
@@ -179,7 +179,7 @@ EOF
def self.install_helper_methods
HelperMethod.helper_methods.each do |name, helper_method_class|
define_method name do |*args, **opts, &block|
- helper_method_class.new.execute(*args, **opts, &block)
+ helper_method_class.instance.execute(*args, **opts, &block)
end unless method_defined?(name)
end
end
diff --git a/test/irb/test_helper_method.rb b/test/irb/test_helper_method.rb
index 5174e5ceb2..291278c16a 100644
--- a/test/irb/test_helper_method.rb
+++ b/test/irb/test_helper_method.rb
@@ -97,13 +97,38 @@ module TestIRB
RUBY
output = run_ruby_file do
- type <<~INPUT
- my_helper
- INPUT
+ type "my_helper"
type "exit"
end
assert_include(output, 'Hello from MyHelper')
end
+
+ def test_helper_method_instances_are_memoized
+ write_ruby <<~RUBY
+ require "irb/helper_method"
+
+ class MyHelper < IRB::HelperMethod::Base
+ description "This is a test helper"
+
+ def execute(val)
+ @val ||= val
+ end
+ end
+
+ IRB::HelperMethod.register(:my_helper, MyHelper)
+
+ binding.irb
+ RUBY
+
+ output = run_ruby_file do
+ type "my_helper(100)"
+ type "my_helper(200)"
+ type "exit"
+ end
+
+ assert_include(output, '=> 100')
+ assert_not_include(output, '=> 200')
+ end
end
end