Module: IRB::MethodExtender

Defined in:
lib/irb/extend-command.rb

Overview

A convenience module for extending Ruby methods.

Instance Method Summary collapse

Instance Method Details

#def_post_proc(base_method, extend_method) ⇒ Object

Extends the given base_method with a postfix call to the given extend_method.



288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'lib/irb/extend-command.rb', line 288

def def_post_proc(base_method, extend_method)
  base_method = base_method.to_s
  extend_method = extend_method.to_s

  alias_name = new_alias_name(base_method)
  module_eval %[
    alias_method alias_name, base_method
    def #{base_method}(*opts)
    send :#{alias_name}, *opts
    send :#{extend_method}, *opts
  end
  ]
end

#def_pre_proc(base_method, extend_method) ⇒ Object

Extends the given base_method with a prefix call to the given extend_method.



272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'lib/irb/extend-command.rb', line 272

def def_pre_proc(base_method, extend_method)
  base_method = base_method.to_s
  extend_method = extend_method.to_s

  alias_name = new_alias_name(base_method)
  module_eval %[
    alias_method alias_name, base_method
    def #{base_method}(*opts)
    send :#{extend_method}, *opts
    send :#{alias_name}, *opts
  end
  ]
end

#new_alias_name(name, prefix = "__alias_of__", postfix = "__") ⇒ Object

Returns a unique method name to use as an alias for the given name.

Usually returns #{prefix}#{name}#{postfix}<num>, example:

new_alias_name('foo') #=> __alias_of__foo__
def bar; end
new_alias_name('bar') #=> __alias_of__bar__2


309
310
311
312
313
314
315
316
317
318
319
# File 'lib/irb/extend-command.rb', line 309

def new_alias_name(name, prefix = "__alias_of__", postfix = "__")
  base_name = "#{prefix}#{name}#{postfix}"
  all_methods = instance_methods(true) + private_instance_methods(true)
  same_methods = all_methods.grep(/^#{Regexp.quote(base_name)}[0-9]*$/)
  return base_name if same_methods.empty?
  no = same_methods.size
  while !same_methods.include?(alias_name = base_name + no)
  no += 1
  end
  alias_name
end