Fixed extension method delegation [#172]

This commit is contained in:
Pat Nakajima 2009-03-05 01:12:28 -05:00 committed by Ryan Tomayko
parent 0e6becf09d
commit c9b2f6b74c
2 changed files with 18 additions and 2 deletions

View File

@ -1011,9 +1011,9 @@ module Sinatra
methods.each do |method_name|
eval <<-RUBY, binding, '(__DELEGATE__)', 1
def #{method_name}(*args, &b)
::Sinatra::Application.#{method_name}(*args, &b)
::Sinatra::Application.send(#{method_name.inspect}, *args, &b)
end
private :#{method_name}
private #{method_name.inspect}
RUBY
end
end

View File

@ -25,6 +25,12 @@ describe 'Registering extensions' do
end
end
module PainExtensions
def foo=(name); end
def bar?(name); end
def fizz!(name); end
end
it 'will add the methods to the DSL for the class in which you register them and its subclasses' do
Sinatra::Base.register FooExtensions
assert Sinatra::Base.respond_to?(:foo)
@ -50,6 +56,16 @@ describe 'Registering extensions' do
map { |m| m.to_sym }.include?(:im_hiding_in_ur_foos)
end
it 'will handle special method names' do
Sinatra::Default.register PainExtensions
assert Sinatra::Delegator.private_instance_methods.
map { |m| m.to_sym }.include?(:foo=)
assert Sinatra::Delegator.private_instance_methods.
map { |m| m.to_sym }.include?(:bar?)
assert Sinatra::Delegator.private_instance_methods.
map { |m| m.to_sym }.include?(:fizz!)
end
it 'will not delegate methods on Base#register' do
Sinatra::Base.register QuuxExtensions
assert !Sinatra::Delegator.private_instance_methods.include?("quux")