Skip to content
Browse files

Add depends_on, use, and setup to abstract up ideas about module inhe…

…ritance.
  • Loading branch information...
1 parent 9c8eaf8 commit c1aa5b0e14cd4bd27a5d8bd85cf7c36fa5911830 @wycats wycats committed Apr 7, 2009
View
9 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
View
23 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
View
17 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 @@ def _render_template(template, options)
private
def _layout() end # This will be overwritten
-
+
def _layout_for_option(name)
case name
when String then _layout_for_name(name)
View
4 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
View
20 actionpack/lib/action_controller/abstract/renderer.rb
@@ -2,20 +2,16 @@
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
View
9 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
View
3 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
View
11 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]
View
4 actionpack/test/abstract_controller/abstract_controller_test.rb
@@ -27,7 +27,7 @@ class TestBasic < ActiveSupport::TestCase
# Test Render mixin
# ====
class RenderingController < AbstractController::Base
- include Renderer
+ use Renderer
def _prefix() end
@@ -116,7 +116,7 @@ class TestPrefixedViews < ActiveSupport::TestCase
# ====
# self._layout is used when defined
class WithLayouts < PrefixedViews
- include Layouts
+ use Layouts
private
def self.layout(formats)
View
2 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
View
4 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)
View
4 actionpack/test/abstract_controller/layouts_test.rb
@@ -5,8 +5,8 @@ module Layouts
# 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 %>",
View
18 actionpack/test/new_base/test_helper.rb
@@ -26,16 +26,14 @@
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
View
1 activesupport/lib/active_support/core_ext/module.rb
@@ -8,6 +8,7 @@
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
View
26 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

3 comments on commit c1aa5b0

@Manfred

Hey cool, where are the tests for core_ext/module/setup?

@mynyml
mynyml commented on c1aa5b0 Apr 14, 2009

nice addition

@wycats
Ruby on Rails member
wycats commented on c1aa5b0 Apr 16, 2009

Manfred: Good catch. Josh wants to move these into private methods of ActionController, but it makes sense to have some tests testing the core functionality.

Please sign in to comment.
Something went wrong with that request. Please try again.