Change soft-fail to use the config, rather than env
[rbx.git] / kernel / core / autoload.rb
bloba708c171688ab3d3e965c4104a316fe0a1afc460
1 ##
2 # Used to implement Module#autoload.
4 class Autoload
5   attr_reader :name
6   attr_reader :scope
7   attr_reader :path
8   attr_reader :original_path
10   def initialize(name, scope, path)
11     @name = name
12     @scope = scope
13     @original_path = path
14     @path, = __split_path__(path)
15     Autoload.add(self)
16   end
18   ##
19   # When any code that finds a constant sees an instance of Autoload as its match,
20   # it calls this method on us
21   def call
22     require(path)
23     scope.const_get(name)
24   end
26   ##
27   # Called by Autoload.remove
28   def discard
29     scope.__send__(:remove_const, name)
30   end
32   ##
33   # Class methods
34   class << self
35     ##
36     # Initializes as a Hash with an empty array as the default value
37     def autoloads
38       @autoloads ||= Hash.new {|h,k| h[k] = Array.new }
39     end
41     ##
42     # Called by Autoload#initialize
43     def add(al)
44       autoloads[al.path] << al
45     end
47     ##
48     # Called by require; see kernel/core/compile.rb
49     def remove(path)
50       al = autoloads.delete(path)
51       return unless al
52       al.each {|a| a.discard }
53     end
54   end
55 end