@@ -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