Class: Dependencies::LoadingModule

Inherits:
Module show all
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

RootLoadingModule

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#pathObject (readonly)

Returns the value of attribute path.



52
53
54
# File 'lib/active_support/dependencies.rb', line 52

def path
  @path
end

#rootObject (readonly)

Returns the value of attribute root.



53
54
55
# File 'lib/active_support/dependencies.rb', line 53

def root
  @root
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.

Returns:

  • (Boolean)


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_pathsObject



65
# File 'lib/active_support/dependencies.rb', line 65

def load_paths() self.root.load_paths end

#root?Boolean

Returns:

  • (Boolean)


64
# File 'lib/active_support/dependencies.rb', line 64

def root?() self.root == self end