diff options
Diffstat (limited to 'actionpack/lib/action_controller/dependencies.rb')
-rw-r--r-- | actionpack/lib/action_controller/dependencies.rb | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/dependencies.rb b/actionpack/lib/action_controller/dependencies.rb new file mode 100644 index 0000000000..6f092500d1 --- /dev/null +++ b/actionpack/lib/action_controller/dependencies.rb @@ -0,0 +1,49 @@ +module ActionController #:nodoc: + module Dependencies #:nodoc: + def self.append_features(base) + super + base.extend(ClassMethods) + end + + module ClassMethods + def model(*models) + require_dependencies(:model, models) + depend_on(:model, models) + end + + def service(*services) + require_dependencies(:service, services) + depend_on(:service, services) + end + + def observer(*observers) + require_dependencies(:observer, observers) + depend_on(:observer, observers) + instantiate_observers(observers) + end + + def dependencies_on(layer) # :nodoc: + read_inheritable_attribute("#{layer}_dependencies") + end + + def depend_on(layer, dependencies) + write_inheritable_array("#{layer}_dependencies", dependencies) + end + + private + def instantiate_observers(observers) + observers.flatten.each { |observer| Object.const_get(Inflector.classify(observer.to_s)).instance } + end + + def require_dependencies(layer, dependencies) + dependencies.flatten.each do |dependency| + begin + require_or_load(dependency.to_s) + rescue LoadError + raise LoadError, "Missing #{layer} #{dependency}.rb" + end + end + end + end + end +end |