diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 16a8f250..1d0cbe67 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -716,13 +716,16 @@ module Sinatra public def helpers(*extensions, &block) - class_eval(&block) if block_given? - include *extensions + class_eval(&block) if block_given? + include *extensions if extensions.any? end def register(*extensions, &block) - extensions << Module.new(&block) if block - extend *extensions + extensions << Module.new(&block) if block_given? + extensions.each do |extension| + extend extension + extension.registered(self) if extension.respond_to?(:registered) + end end def development? ; environment == :development ; end diff --git a/test/extensions_test.rb b/test/extensions_test.rb index 26779663..ec9d8296 100644 --- a/test/extensions_test.rb +++ b/test/extensions_test.rb @@ -60,4 +60,25 @@ describe 'Registering extensions' do assert !Sinatra::Base.respond_to?(:baz) assert Sinatra::Default.respond_to?(:baz) end + + module BizzleExtension + def bizzle + bizzle_option + end + + def self.registered(base) + fail "base should be BizzleApp" unless base == BizzleApp + fail "base should have already extended BizzleExtension" unless base.respond_to?(:bizzle) + base.set :bizzle_option, 'bizzle!' + end + end + + class BizzleApp < Sinatra::Base + end + + it 'sends .registered to the extension module after extending the class' do + BizzleApp.register BizzleExtension + assert_equal 'bizzle!', BizzleApp.bizzle_option + assert_equal 'bizzle!', BizzleApp.bizzle + end end