aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/initializable.rb
diff options
context:
space:
mode:
authorCarl Lerche <carllerche@mac.com>2009-10-08 12:14:57 -0700
committerCarl Lerche <carllerche@mac.com>2009-10-08 12:31:09 -0700
commite4d7e5090c928e5b64350be9a1fb3aaf6f968e4c (patch)
tree27fe4309341ed992a1f9ca4867f3db6ee46802eb /railties/lib/rails/initializable.rb
parent6d6ae0841c94d3c0ce0c91311028ff7396c44a4a (diff)
downloadrails-e4d7e5090c928e5b64350be9a1fb3aaf6f968e4c.tar.gz
rails-e4d7e5090c928e5b64350be9a1fb3aaf6f968e4c.tar.bz2
rails-e4d7e5090c928e5b64350be9a1fb3aaf6f968e4c.zip
Moving more initializers into the application object
Diffstat (limited to 'railties/lib/rails/initializable.rb')
-rw-r--r--railties/lib/rails/initializable.rb69
1 files changed, 49 insertions, 20 deletions
diff --git a/railties/lib/rails/initializable.rb b/railties/lib/rails/initializable.rb
index 61c98d4f99..4bd5088207 100644
--- a/railties/lib/rails/initializable.rb
+++ b/railties/lib/rails/initializable.rb
@@ -2,20 +2,58 @@ module Rails
module Initializable
# A collection of initializers
- class Collection < ActiveSupport::OrderedHash
- # def initialize_copy(other)
- # super
- # each do |key, value|
- # self[key] = value.dup
- # end
- # end
+ class Collection
+ def initialize(context)
+ @context = context
+ @keys = []
+ @values = {}
+ @ran = false
+ end
def run
+ return self if @ran
each do |key, initializer|
- initializer.run
+ @context.class_eval(&initializer.block)
end
+ @ran = true
self
end
+
+ def [](key)
+ keys, values = merge_with_parent
+ values[key.to_sym]
+ end
+
+ def []=(key, value)
+ key = key.to_sym
+ @keys |= [key]
+ @values[key] = value
+ end
+
+ def each
+ keys, values = merge_with_parent
+ keys.each { |k| yield k, values[k] }
+ self
+ end
+
+ protected
+
+ attr_reader :keys, :values
+
+ private
+
+ def merge_with_parent
+ keys, values = [], {}
+
+ if @context.is_a?(Class) && @context.superclass.is_a?(Initializable)
+ parent = @context.superclass.initializers
+ keys, values = parent.keys, parent.values
+ end
+
+ values = values.merge(@values)
+ return keys | @keys, values
+ end
+
end
class Initializer
@@ -24,24 +62,15 @@ module Rails
def initialize(name, options = {}, &block)
@name, @options, @block = name, options, block
end
-
- def run
- return if @already_ran
- @block.call
- @already_ran = true
- end
end
def initializer(name, options = {}, &block)
- initializers[name] = Initializer.new(name, options, &block)
+ @initializers ||= Collection.new(self)
+ @initializers[name] = Initializer.new(name, options, &block)
end
def initializers
- @initializers ||= Collection.new
- end
-
- def initializers=(initializers)
- @initializers = initializers
+ @initializers ||= Collection.new(self)
end
end