module Rails
module Initializable
# A collection of initializers
class Collection
def initialize(context)
@context = context
@keys = []
@values = {}
@ran = false
end
def run
return self if @ran
each do |key, initializer|
@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
attr_reader :name, :options, :block
def initialize(name, options = {}, &block)
@name, @options, @block = name, options, block
end
end
def initializer(name, options = {}, &block)
@initializers ||= Collection.new(self)
@initializers[name] = Initializer.new(name, options, &block)
end
def initializers
@initializers ||= Collection.new(self)
end
end
extend Initializable
# Check for valid Ruby version (1.8.2 or 1.8.4 or higher). This is done in an
# external file, so we can use it from the `rails` program as well without duplication.
initializer :check_ruby_version do
require 'rails/ruby_version_check'
end
# For Ruby 1.8, this initialization sets $KCODE to 'u' to enable the
# multibyte safe operations. Plugin authors supporting other encodings
# should override this behaviour and set the relevant +default_charset+
# on ActionController::Base.
#
# For Ruby 1.9, UTF-8 is the default internal and external encoding.
initializer :initialize_encoding do
if RUBY_VERSION < '1.9'
$KCODE='u'
else
Encoding.default_external = Encoding::UTF_8
end
end
end