Class: Dependencies::LoadingModule
- Defined in:
- lib/active_support/dependencies.rb
Overview
LoadingModules implement namespace-safe dynamic loading. They support automatic loading via const_missing, allowing contained items to be automatically loaded when required. No extra syntax is required, as expressions such as Controller::Admin::UserController load the relavent files automatically.
Ruby-style modules are supported, as a folder named ‘submodule’ will load ‘submodule.rb’ when available.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#path ⇒ Object
readonly
:nodoc:.
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Class Method Summary collapse
Instance Method Summary collapse
-
#const_available?(name) ⇒ Boolean
Is this name present or loadable? This method is used by Routes to find valid controllers.
-
#const_load!(name, file_name = nil) ⇒ Object
Load the controller class or a parent module.
-
#const_missing(name) ⇒ Object
Load missing constants if possible.
-
#initialize(root, path = []) ⇒ LoadingModule
constructor
A new instance of LoadingModule.
- #load_paths ⇒ Object
- #root? ⇒ Boolean
Methods inherited from Module
#mattr_accessor, #mattr_reader, #mattr_writer
Constructor Details
#initialize(root, path = []) ⇒ LoadingModule
Returns a new instance of LoadingModule.
61 62 63 64 |
# File 'lib/active_support/dependencies.rb', line 61 def initialize(root, path=[]) @path = path.clone.freeze @root = root end |
Instance Attribute Details
#path ⇒ Object (readonly)
:nodoc:
52 53 54 |
# File 'lib/active_support/dependencies.rb', line 52 def path @path end |
Class Method Details
.root(*load_paths) ⇒ Object
56 57 58 |
# File 'lib/active_support/dependencies.rb', line 56 def root(*load_paths) RootLoadingModule.new(*load_paths) end |
Instance Method Details
#const_available?(name) ⇒ Boolean
Is this name present or loadable? This method is used by Routes to find valid controllers.
109 110 111 |
# File 'lib/active_support/dependencies.rb', line 109 def const_available?(name) self.const_defined?(name) || load_paths.any? {|lp| lp.filesystem_path(path + [name])} end |
#const_load!(name, file_name = nil) ⇒ Object
Load the controller class or a parent module.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/active_support/dependencies.rb', line 75 def const_load!(name, file_name = nil) file_name ||= 'application' if root? && name.to_s == 'ApplicationController' path = self.path + [file_name || name] load_paths.each do |load_path| fs_path = load_path.filesystem_path(path) next unless fs_path case when File.directory?(fs_path) new_module = LoadingModule.new(self.root, self.path + [name]) self.const_set name, new_module if self.root? if Object.const_defined?(name) msg = "Cannot load module #{name}: Object::#{name} is set to #{Object.const_get(name).inspect}" raise NameError, msg end Object.const_set(name, new_module) end break when File.file?(fs_path) self.root.load_file!(fs_path) # Import the loaded constant from Object provided we are the root node. self.const_set(name, Object.const_get(name)) if self.root? && Object.const_defined?(name) break end end self.const_defined?(name) end |
#const_missing(name) ⇒ Object
Load missing constants if possible.
70 71 72 |
# File 'lib/active_support/dependencies.rb', line 70 def const_missing(name) const_load!(name) ? const_get(name) : super(name) end |
#load_paths ⇒ Object
67 |
# File 'lib/active_support/dependencies.rb', line 67 def load_paths() self.root.load_paths end |
#root? ⇒ Boolean
66 |
# File 'lib/active_support/dependencies.rb', line 66 def root?() self.root == self end |