aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/dependencies.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/dependencies.rb')
-rw-r--r--actionpack/lib/action_controller/dependencies.rb49
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