Skip to content

Commit b0f401c

Browse files
hsbtbyroot
andcommitted
Reapply "Merge pull request #46 from byroot/use-forward-send"
This reverts commit fc2bd04. Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
1 parent fc2bd04 commit b0f401c

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

lib/delegate.rb

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,14 @@ def DelegateClass(superclass, &block)
405405
protected_instance_methods -= ignores
406406
public_instance_methods = superclass.public_instance_methods
407407
public_instance_methods -= ignores
408+
409+
instance_methods = (public_instance_methods + protected_instance_methods)
410+
normal, special = instance_methods.partition { |m| m.match?(/\A[a-zA-Z]\w*[!\?]?\z/) }
411+
412+
source = normal.map do |method|
413+
"def #{method}(...); __getobj__.#{method}(...); end"
414+
end
415+
408416
klass.module_eval do
409417
def __getobj__ # :nodoc:
410418
unless defined?(@delegate_dc_obj)
@@ -413,18 +421,21 @@ def __getobj__ # :nodoc:
413421
end
414422
@delegate_dc_obj
415423
end
424+
416425
def __setobj__(obj) # :nodoc:
417426
__raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
418427
@delegate_dc_obj = obj
419428
end
420-
protected_instance_methods.each do |method|
421-
define_method(method, Delegator.delegating_block(method))
422-
protected method
423-
end
424-
public_instance_methods.each do |method|
429+
430+
class_eval(source.join(";"), __FILE__, __LINE__)
431+
432+
special.each do |method|
425433
define_method(method, Delegator.delegating_block(method))
426434
end
435+
436+
protected(*protected_instance_methods)
427437
end
438+
428439
klass.define_singleton_method :public_instance_methods do |all=true|
429440
super(all) | superclass.public_instance_methods
430441
end

0 commit comments

Comments
 (0)