2004-12-29 21:19:37 +00:00
|
|
|
require File.dirname(__FILE__) + '/module_attribute_accessors'
|
2004-12-29 21:03:21 +00:00
|
|
|
|
|
|
|
module Dependencies
|
|
|
|
extend self
|
|
|
|
|
|
|
|
@@loaded = [ ]
|
|
|
|
mattr_accessor :loaded
|
|
|
|
|
|
|
|
@@mechanism = :load
|
|
|
|
mattr_accessor :mechanism
|
|
|
|
|
2005-01-24 10:58:17 +00:00
|
|
|
def load?
|
|
|
|
mechanism == :load
|
|
|
|
end
|
|
|
|
|
2004-12-29 21:03:21 +00:00
|
|
|
def depend_on(file_name, swallow_load_errors = false)
|
2004-12-30 00:12:39 +00:00
|
|
|
if !loaded.include?(file_name)
|
2005-01-24 00:34:08 +00:00
|
|
|
loaded << file_name
|
2004-12-30 00:12:39 +00:00
|
|
|
begin
|
|
|
|
require_or_load(file_name)
|
|
|
|
rescue LoadError
|
|
|
|
raise unless swallow_load_errors
|
|
|
|
end
|
2004-12-29 21:03:21 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def associate_with(file_name)
|
|
|
|
depend_on(file_name, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
def clear
|
|
|
|
self.loaded = [ ]
|
|
|
|
end
|
|
|
|
|
2005-01-23 19:42:40 +00:00
|
|
|
def reload
|
2005-01-24 00:30:15 +00:00
|
|
|
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
|
2005-01-23 19:42:40 +00:00
|
|
|
end
|
|
|
|
|
2005-01-24 00:30:15 +00:00
|
|
|
def require_or_load(file_name)
|
|
|
|
mechanism == :load ? silence_warnings { load("#{file_name}.rb") } : require(file_name)
|
|
|
|
end
|
2004-12-29 21:03:21 +00:00
|
|
|
end
|
|
|
|
|
2005-01-24 00:30:15 +00:00
|
|
|
Object.send(:define_method, :require_or_load) { |file_name| Dependencies.require_or_load(file_name) } unless Object.respond_to?(:require_or_load)
|
2004-12-29 21:03:21 +00:00
|
|
|
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)
|
|
|
|
|
2005-01-17 01:29:45 +00:00
|
|
|
class Object #:nodoc:
|
2004-12-29 21:03:21 +00:00
|
|
|
class << self
|
|
|
|
# Use const_missing to autoload associations so we don't have to
|
|
|
|
# require_association when using single-table inheritance.
|
2005-01-24 00:30:15 +00:00
|
|
|
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}"
|
2004-12-29 21:03:21 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2004-12-30 00:12:39 +00:00
|
|
|
end
|