1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activesupport/lib/active_support/dependencies/autoload.rb
Pan Thomakos 6b480d2e82 Improved ActiveSupport::Autoload performance.
`ActiveSupport::Autoload#autoload` performance is improved in the default
case where a path is present. Since the full path name is not generated, it
isn't necessary to determine the full constant name either. This results in a
3x performance gain and reduces the number of Ruby objects generated. For a full
benchmark check [this gist](https://gist.github.com/2020228).
2012-03-11 23:26:48 -07:00

53 lines
1.1 KiB
Ruby

require "active_support/inflector/methods"
require "active_support/lazy_load_hooks"
module ActiveSupport
module Autoload
@@autoloads = {}
@@under_path = nil
@@at_path = nil
@@eager_autoload = false
def autoload(const_name, path = @@at_path)
unless path
full = [name, @@under_path, const_name.to_s, path].compact.join("::")
path = Inflector.underscore(full)
end
if @@eager_autoload
@@autoloads[const_name] = path
end
super const_name, path
end
def autoload_under(path)
@@under_path, old_path = path, @@under_path
yield
ensure
@@under_path = old_path
end
def autoload_at(path)
@@at_path, old_path = path, @@at_path
yield
ensure
@@at_path = old_path
end
def eager_autoload
old_eager, @@eager_autoload = @@eager_autoload, true
yield
ensure
@@eager_autoload = old_eager
end
def self.eager_autoload!
@@autoloads.values.each { |file| require file }
end
def autoloads
@@autoloads
end
end
end