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
Returns the value of attribute path.
-
#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.
59 60 61 62 |
# File 'lib/active_support/dependencies.rb', line 59 def initialize(root, path=[]) @path = path.clone.freeze @root = root end |
Instance Attribute Details
#path ⇒ Object (readonly)
Returns the value of attribute path.
52 53 54 |
# File 'lib/active_support/dependencies.rb', line 52 def path @path end |
Class Method Details
.root(*load_paths) ⇒ Object
55 56 57 |
# File 'lib/active_support/dependencies.rb', line 55 def self.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.
105 106 107 |
# File 'lib/active_support/dependencies.rb', line 105 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.
73 74 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 |
# File 'lib/active_support/dependencies.rb', line 73 def const_load!(name, file_name = nil) path = self.path + [file_name || name] load_paths.each do |load_path| fs_path = load_path.filesystem_path(path) next unless fs_path if 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 elsif 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 return self.const_defined?(name) end |
#const_missing(name) ⇒ Object
Load missing constants if possible.
68 69 70 |
# File 'lib/active_support/dependencies.rb', line 68 def const_missing(name) const_load!(name) ? const_get(name) : super(name) end |
#load_paths ⇒ Object
65 |
# File 'lib/active_support/dependencies.rb', line 65 def load_paths() self.root.load_paths end |
#root? ⇒ Boolean
64 |
# File 'lib/active_support/dependencies.rb', line 64 def root?() self.root == self end |