Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 6441

Show
Ignore:
Timestamp:
03/18/07 03:16:53 (1 year ago)
Author:
bitsweat
Message:

alias_method_chain preserves the original method's visibility. Closes #7854.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activesupport/CHANGELOG

    r6427 r6441  
    11*SVN* 
     2 
     3* alias_method_chain preserves the original method's visibility.  #7854 [Jonathan Viney] 
    24 
    35* Update Dependencies to ignore constants inherited from ancestors. Closes #6951. [Nicholas Seckar] 
  • trunk/activesupport/lib/active_support/core_ext/module/aliasing.rb

    r5113 r6441  
    2626    aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1 
    2727    yield(aliased_target, punctuation) if block_given? 
    28     alias_method "#{aliased_target}_without_#{feature}#{punctuation}", target 
    29     alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}" 
     28     
     29    with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}" 
     30     
     31    alias_method without_method, target 
     32    alias_method target, with_method 
     33     
     34    case 
     35      when public_method_defined?(without_method) 
     36        public target 
     37      when protected_method_defined?(without_method) 
     38        protected target 
     39      when private_method_defined?(without_method) 
     40        private target 
     41    end 
    3042  end 
    3143 
  • trunk/activesupport/test/core_ext/module_test.rb

    r6426 r6441  
    129129  def quux_with_baz=(v) 
    130130    send(:quux_without_baz=, v) << '_with_baz' 
     131  end 
     132   
     133  def duck_with_orange 
     134    duck_without_orange << '_with_orange' 
    131135  end 
    132136end 
     
    227231    assert block_called 
    228232  end 
    229 end 
     233   
     234  def test_alias_method_chain_preserves_private_method_status 
     235    FooClassWithBarMethod.send(:define_method, 'duck', Proc.new { 'duck' }) 
     236    FooClassWithBarMethod.send(:include, BarMethodAliaser) 
     237    FooClassWithBarMethod.send(:private, :duck) 
     238     
     239    FooClassWithBarMethod.alias_method_chain :duck, :orange 
     240     
     241    assert_raises NoMethodError do 
     242      @instance.duck 
     243    end 
     244     
     245    assert_equal 'duck_with_orange', @instance.send(:duck) 
     246    assert FooClassWithBarMethod.private_method_defined?(:duck) 
     247  end 
     248   
     249  def test_alias_method_chain_preserves_protected_method_status 
     250    FooClassWithBarMethod.send(:define_method, 'duck', Proc.new { 'duck' }) 
     251    FooClassWithBarMethod.send(:include, BarMethodAliaser) 
     252    FooClassWithBarMethod.send(:protected, :duck) 
     253     
     254    FooClassWithBarMethod.alias_method_chain :duck, :orange 
     255     
     256    assert_raises NoMethodError do 
     257      @instance.duck 
     258    end 
     259     
     260    assert_equal 'duck_with_orange', @instance.send(:duck) 
     261    assert FooClassWithBarMethod.protected_method_defined?(:duck) 
     262  end 
     263   
     264  def test_alias_method_chain_preserves_public_method_status 
     265    FooClassWithBarMethod.send(:define_method, 'duck', Proc.new { 'duck' }) 
     266    FooClassWithBarMethod.send(:include, BarMethodAliaser) 
     267    FooClassWithBarMethod.send(:public, :duck) 
     268     
     269    FooClassWithBarMethod.alias_method_chain :duck, :orange 
     270     
     271    assert_equal 'duck_with_orange', @instance.duck 
     272    assert FooClassWithBarMethod.public_method_defined?(:duck) 
     273  end 
     274end