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


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

#pathObject (readonly)

:nodoc:


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


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_pathsObject


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