diff --git a/actionpack/lib/action_controller/abstract/callbacks.rb b/actionpack/lib/action_controller/abstract/callbacks.rb index a88d4c1567..c8b509081c 100644 --- a/actionpack/lib/action_controller/abstract/callbacks.rb +++ b/actionpack/lib/action_controller/abstract/callbacks.rb @@ -1,11 +1,8 @@ module AbstractController module Callbacks - def self.included(klass) - klass.class_eval do - include ActiveSupport::NewCallbacks - define_callbacks :process_action - extend ClassMethods - end + setup do + include ActiveSupport::NewCallbacks + define_callbacks :process_action end def process_action diff --git a/actionpack/lib/action_controller/abstract/helpers.rb b/actionpack/lib/action_controller/abstract/helpers.rb index 1947c360b8..1f0b38417b 100644 --- a/actionpack/lib/action_controller/abstract/helpers.rb +++ b/actionpack/lib/action_controller/abstract/helpers.rb @@ -1,17 +1,18 @@ module AbstractController module Helpers - - def self.included(klass) - klass.class_eval do - extend ClassMethods - unless self < ::AbstractController::Renderer - raise "You need to include AbstractController::Renderer before including " \ - "AbstractController::Helpers" - end - extlib_inheritable_accessor :master_helper_module - self.master_helper_module = Module.new - end + depends_on Renderer + + setup do + extlib_inheritable_accessor :master_helper_module + self.master_helper_module = Module.new end + + # def self.included(klass) + # klass.class_eval do + # extlib_inheritable_accessor :master_helper_module + # self.master_helper_module = Module.new + # end + # end def _action_view @_action_view ||= begin diff --git a/actionpack/lib/action_controller/abstract/layouts.rb b/actionpack/lib/action_controller/abstract/layouts.rb index 20c9abb9e5..2680283151 100644 --- a/actionpack/lib/action_controller/abstract/layouts.rb +++ b/actionpack/lib/action_controller/abstract/layouts.rb @@ -1,25 +1,24 @@ module AbstractController module Layouts - def self.included(base) - base.extend ClassMethods - end - + depends_on Renderer + module ClassMethods def layout(layout) unless [String, Symbol, FalseClass, NilClass].include?(layout.class) raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil" end - @layout = layout || false # Converts nil to false + @_layout = layout || false # Converts nil to false + _write_layout_method end def _write_layout_method - case @layout + case @_layout when String - self.class_eval %{def _layout() #{@layout.inspect} end} + self.class_eval %{def _layout() #{@_layout.inspect} end} when Symbol - self.class_eval %{def _layout() #{@layout} end} + self.class_eval %{def _layout() #{@_layout} end} when false self.class_eval %{def _layout() end} else @@ -43,7 +42,7 @@ module AbstractController private def _layout() end # This will be overwritten - + def _layout_for_option(name) case name when String then _layout_for_name(name) diff --git a/actionpack/lib/action_controller/abstract/logger.rb b/actionpack/lib/action_controller/abstract/logger.rb index 846d8ad040..4117369bd4 100644 --- a/actionpack/lib/action_controller/abstract/logger.rb +++ b/actionpack/lib/action_controller/abstract/logger.rb @@ -1,7 +1,7 @@ module AbstractController module Logger - def self.included(klass) - klass.cattr_accessor :logger + setup do + cattr_accessor :logger end end end \ No newline at end of file diff --git a/actionpack/lib/action_controller/abstract/renderer.rb b/actionpack/lib/action_controller/abstract/renderer.rb index 5daade6109..68c3b07b84 100644 --- a/actionpack/lib/action_controller/abstract/renderer.rb +++ b/actionpack/lib/action_controller/abstract/renderer.rb @@ -2,20 +2,16 @@ require "action_controller/abstract/logger" module AbstractController module Renderer + depends_on AbstractController::Logger - def self.included(klass) - klass.class_eval do - extend ClassMethods - - attr_internal :formats - - extlib_inheritable_accessor :_view_paths - - self._view_paths ||= ActionView::PathSet.new - include AbstractController::Logger - end + setup do + attr_internal :formats + + extlib_inheritable_accessor :_view_paths + + self._view_paths ||= ActionView::PathSet.new end - + def _action_view @_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self) end diff --git a/actionpack/lib/action_controller/new_base/hide_actions.rb b/actionpack/lib/action_controller/new_base/hide_actions.rb index b3777c3c1e..473a8ea72b 100644 --- a/actionpack/lib/action_controller/new_base/hide_actions.rb +++ b/actionpack/lib/action_controller/new_base/hide_actions.rb @@ -1,11 +1,8 @@ module ActionController module HideActions - def self.included(klass) - klass.class_eval do - extend ClassMethods - extlib_inheritable_accessor :hidden_actions - self.hidden_actions ||= Set.new - end + setup do + extlib_inheritable_accessor :hidden_actions + self.hidden_actions ||= Set.new end def action_methods() self.class.action_names end diff --git a/actionpack/lib/action_controller/new_base/layouts.rb b/actionpack/lib/action_controller/new_base/layouts.rb index c0efb669b2..2351472dad 100644 --- a/actionpack/lib/action_controller/new_base/layouts.rb +++ b/actionpack/lib/action_controller/new_base/layouts.rb @@ -1,5 +1,8 @@ module ActionController module Layouts + depends_on ActionController::Renderer + depends_on AbstractController::Layouts + def render_to_string(options) if !options.key?(:text) || options.key?(:layout) options[:_layout] = options.key?(:layout) ? _layout_for_option(options[:layout]) : _default_layout diff --git a/actionpack/lib/action_controller/new_base/renderer.rb b/actionpack/lib/action_controller/new_base/renderer.rb index 24ca9be077..044c15f409 100644 --- a/actionpack/lib/action_controller/new_base/renderer.rb +++ b/actionpack/lib/action_controller/new_base/renderer.rb @@ -1,15 +1,6 @@ module ActionController module Renderer - - # def self.included(klass) - # klass.extend ClassMethods - # end - # - # module ClassMethods - # def prefix - # @prefix ||= name.underscore - # end - # end + depends_on AbstractController::Renderer def initialize(*) self.formats = [:html] diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract_controller/abstract_controller_test.rb index 96193fd24c..6d33888821 100644 --- a/actionpack/test/abstract_controller/abstract_controller_test.rb +++ b/actionpack/test/abstract_controller/abstract_controller_test.rb @@ -27,7 +27,7 @@ module AbstractController # Test Render mixin # ==== class RenderingController < AbstractController::Base - include Renderer + use Renderer def _prefix() end @@ -116,7 +116,7 @@ module AbstractController # ==== # self._layout is used when defined class WithLayouts < PrefixedViews - include Layouts + use Layouts private def self.layout(formats) diff --git a/actionpack/test/abstract_controller/callbacks_test.rb b/actionpack/test/abstract_controller/callbacks_test.rb index 89243b631e..5fce30f478 100644 --- a/actionpack/test/abstract_controller/callbacks_test.rb +++ b/actionpack/test/abstract_controller/callbacks_test.rb @@ -4,7 +4,7 @@ module AbstractController module Testing class ControllerWithCallbacks < AbstractController::Base - include AbstractController::Callbacks + use AbstractController::Callbacks end class Callback1 < ControllerWithCallbacks diff --git a/actionpack/test/abstract_controller/helper_test.rb b/actionpack/test/abstract_controller/helper_test.rb index e1b2141331..6284fa4f70 100644 --- a/actionpack/test/abstract_controller/helper_test.rb +++ b/actionpack/test/abstract_controller/helper_test.rb @@ -4,8 +4,8 @@ module AbstractController module Testing class ControllerWithHelpers < AbstractController::Base - include Renderer - include Helpers + use Renderer + use Helpers def render(string) super(:_template_name => string) diff --git a/actionpack/test/abstract_controller/layouts_test.rb b/actionpack/test/abstract_controller/layouts_test.rb index 838a44be12..ec8faffc51 100644 --- a/actionpack/test/abstract_controller/layouts_test.rb +++ b/actionpack/test/abstract_controller/layouts_test.rb @@ -5,8 +5,8 @@ module AbstractControllerTests # Base controller for these tests class Base < AbstractController::Base - include AbstractController::Renderer - include AbstractController::Layouts + use AbstractController::Renderer + use AbstractController::Layouts self.view_paths = [ActionView::FixtureTemplate::FixturePath.new( "layouts/hello.erb" => "With String <%= yield %>", diff --git a/actionpack/test/new_base/test_helper.rb b/actionpack/test/new_base/test_helper.rb index 420abe58f7..9058060059 100644 --- a/actionpack/test/new_base/test_helper.rb +++ b/actionpack/test/new_base/test_helper.rb @@ -26,16 +26,14 @@ require 'rack/test' module ActionController class Base2 < AbstractBase - include AbstractController::Callbacks - include AbstractController::Renderer - include AbstractController::Helpers - include AbstractController::Layouts - include AbstractController::Logger - - include ActionController::HideActions - include ActionController::UrlFor - include ActionController::Layouts - include ActionController::Renderer + use AbstractController::Callbacks + use AbstractController::Helpers + use AbstractController::Logger + + use ActionController::HideActions + use ActionController::UrlFor + use ActionController::Renderer + use ActionController::Layouts def self.inherited(klass) ::ActionController::Base2.subclasses << klass.to_s diff --git a/activesupport/lib/active_support/core_ext/module.rb b/activesupport/lib/active_support/core_ext/module.rb index da8d28ec13..cb31437094 100644 --- a/activesupport/lib/active_support/core_ext/module.rb +++ b/activesupport/lib/active_support/core_ext/module.rb @@ -8,6 +8,7 @@ require 'active_support/core_ext/module/loading' require 'active_support/core_ext/module/aliasing' require 'active_support/core_ext/module/model_naming' require 'active_support/core_ext/module/synchronization' +require 'active_support/core_ext/module/setup' module ActiveSupport module CoreExtensions diff --git a/activesupport/lib/active_support/core_ext/module/setup.rb b/activesupport/lib/active_support/core_ext/module/setup.rb new file mode 100644 index 0000000000..e6dfd0cf56 --- /dev/null +++ b/activesupport/lib/active_support/core_ext/module/setup.rb @@ -0,0 +1,26 @@ +class Module + attr_accessor :_setup_block + attr_accessor :_dependencies + + def setup(&blk) + @_setup_block = blk + end + + def use(mod) + return if self < mod + + (mod._dependencies || []).each do |dep| + use dep + end + # raise "Circular dependencies" if self < mod + include mod + extend mod.const_get("ClassMethods") if mod.const_defined?("ClassMethods") + class_eval(&mod._setup_block) if mod._setup_block + end + + def depends_on(mod) + return if self < mod + @_dependencies ||= [] + @_dependencies << mod + end +end \ No newline at end of file