From 25eaf062c2b2c19025d85da1d6fb667afc63a642 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 24 Jan 2005 00:30:15 +0000 Subject: Another swing at reloading git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@480 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activesupport/lib/dependencies.rb | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) (limited to 'activesupport') diff --git a/activesupport/lib/dependencies.rb b/activesupport/lib/dependencies.rb index 4f4dfa4a71..38197bff6d 100644 --- a/activesupport/lib/dependencies.rb +++ b/activesupport/lib/dependencies.rb @@ -11,10 +11,9 @@ module Dependencies def depend_on(file_name, swallow_load_errors = false) if !loaded.include?(file_name) - loaded << file_name - begin require_or_load(file_name) + loaded << file_name rescue LoadError raise unless swallow_load_errors end @@ -30,17 +29,21 @@ module Dependencies end def reload - old_loaded = loaded.dup - clear - old_loaded.each { |file_name| depend_on(file_name, true) } + loaded.each do |file_name| + begin + silence_warnings { load("#{file_name}.rb") } + rescue LoadError + # We don't care if the file was removed now + end + end end - private - def require_or_load(file_name) - mechanism == :load ? silence_warnings { load("#{file_name}.rb") } : require(file_name) - end + def require_or_load(file_name) + mechanism == :load ? silence_warnings { load("#{file_name}.rb") } : require(file_name) + end end +Object.send(:define_method, :require_or_load) { |file_name| Dependencies.require_or_load(file_name) } unless Object.respond_to?(:require_or_load) Object.send(:define_method, :require_dependency) { |file_name| Dependencies.depend_on(file_name) } unless Object.respond_to?(:require_dependency) Object.send(:define_method, :require_association) { |file_name| Dependencies.associate_with(file_name) } unless Object.respond_to?(:require_association) @@ -48,16 +51,12 @@ class Object #:nodoc: class << self # Use const_missing to autoload associations so we don't have to # require_association when using single-table inheritance. - unless respond_to?(:pre_dependency_const_missing) - alias_method :pre_dependency_const_missing, :const_missing - - def const_missing(class_id) - begin - require_dependency(Inflector.underscore(Inflector.demodulize(class_id.to_s))) - return Object.const_get(class_id) if Object.const_defined?(class_id) - rescue LoadError - pre_dependency_const_missing(class_id) - end + def const_missing(class_id) + begin + require_dependency(Inflector.underscore(Inflector.demodulize(class_id.to_s))) + if Object.const_defined?(class_id) then return Object.const_get(class_id) else raise LoadError end + rescue LoadError + raise NameError, "uninitialized constant #{class_id}" end end end -- cgit v1.2.3