aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
authorYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-11-05 14:45:53 -0800
committerYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-11-05 14:45:53 -0800
commit43694269934540de2a73130d7ff47bd1a25ed3e4 (patch)
treec1f0cdeb90bdccd217c88c645a2ebd78c4d0e772 /railties
parent897164ddb70ed6f51b026e5c91f2bf3f7aa46ba6 (diff)
downloadrails-43694269934540de2a73130d7ff47bd1a25ed3e4.tar.gz
rails-43694269934540de2a73130d7ff47bd1a25ed3e4.tar.bz2
rails-43694269934540de2a73130d7ff47bd1a25ed3e4.zip
Add the ability to merge initializers from various objects in order.
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/rails/initializable.rb42
-rw-r--r--railties/test/initializable_test.rb8
2 files changed, 44 insertions, 6 deletions
diff --git a/railties/lib/rails/initializable.rb b/railties/lib/rails/initializable.rb
index 93349454dd..d78eab9a75 100644
--- a/railties/lib/rails/initializable.rb
+++ b/railties/lib/rails/initializable.rb
@@ -4,8 +4,35 @@ module Rails
base.extend ClassMethods
end
- Initializer = Struct.new(:name, :before, :after, :global, :block) do
+ class Initializer
+ attr_reader :name, :before, :after, :global, :block
+
+ def initialize(name, context, options, &block)
+ @name, @context, @options, @block = name, context, options, block
+ end
+
+ def before
+ @options[:before]
+ end
+
+ def after
+ @options[:after]
+ end
+
+ def global
+ @options[:global]
+ end
+
alias global? global
+
+ def run(*args)
+ @context.instance_exec(*args, &block)
+ end
+
+ def bind(context)
+ return self if @context
+ Initializer.new(@name, context, @options, &block)
+ end
end
class Collection < Array
@@ -35,12 +62,19 @@ module Rails
def run_initializers(*args)
return if @ran
- self.class.initializers_for(:instance).each do |initializer|
- instance_exec(*args, &initializer.block)
+ initializers.each do |initializer|
+ initializer.run(*args)
end
@ran = true
end
+ def initializers
+ @initializers ||= begin
+ initializers = self.class.initializers_for(:instance)
+ Collection.new(initializers.map { |i| i.bind(self) })
+ end
+ end
+
module ClassMethods
def initializers
@initializers ||= []
@@ -59,7 +93,7 @@ module Rails
def initializer(name, opts = {}, &blk)
@initializers ||= []
- @initializers << Initializer.new(name, opts[:before], opts[:after], opts[:global], blk)
+ @initializers << Initializer.new(name, nil, opts, &blk)
end
def run_initializers(*args)
diff --git a/railties/test/initializable_test.rb b/railties/test/initializable_test.rb
index 463fdc03c0..2920883132 100644
--- a/railties/test/initializable_test.rb
+++ b/railties/test/initializable_test.rb
@@ -94,7 +94,11 @@ module InitializableTests
include Rails::Initializable
initializer :startup, :before => :last do
- $arr << 2
+ $arr << two
+ end
+
+ def two
+ 2
end
end
@@ -109,7 +113,7 @@ module InitializableTests
end
def self.initializers
- super + MoreInitializers.initializers
+ super + MoreInitializers.new.initializers
end
end