path = File.expand_path File.join(File.dirname(__FILE__), 'lib') $:.unshift(path) unless $:.include?(path) || $:.include?(File.expand_path(path)) RTML_ROOT = File.expand_path(File.join(File.dirname(__FILE__), "..")) unless defined?(RTML_ROOT) require 'rtml/version' module Rtml class << self def root RTML_ROOT end def configuration @configuration ||= Rtml::Configuration.new end def configure yield configuration configuration.validate! end # Defines a single RTML action. # # Examples: # Rtml.action :index, :controller => :rtml do # def index # # . . . # end # end # def action(name, controller, &block) case controller when Array then controllers = controller when String, Symbol, ActionController::Base then controllers = [ controller ] when Hash then controllers = [ controller.delete(:controller) ] || controller.delete(:controllers) else raise ArgumentError, "Expected an Array, String, Symbol or Hash listing affected controllers" end actions_for controllers do define_method name do self.instance_eval &block end end end # Defines a block containing a set of RTML actions for the specified controllers. # # Examples: # Rtml::actions_for :controller_name do # def index # # . . . # end # end # def actions_for(*controllers, &block) raise ArgumentError, "actions_for: block containing RTML actions is expected", caller unless block_given? (controllers.flatten.collect do |controller| case controller when String, Symbol then "#{controller.to_s.camelize}Controller".constantize else controller end end).each do |controller| helpers = controller.rtml_helpers old_methods = helpers.instance_methods helpers.class_eval &block new_methods = helpers.instance_methods - old_methods controller.rtml_actions.concat new_methods new_methods.each do |method_name| unless helpers.hidden_action?(method_name) helpers.class_eval(<<-end_code, __FILE__, __LINE__+1) def #{method_name}_with_ivars copy_ivars_from(controller) # Give rtml actions access to the controller's view helpers (class << self; self; end).send(:include, controller.response.template.helpers) #{method_name}_without_ivars end end_code helpers.send(:alias_method_chain, method_name, :ivars) end unless helpers.hidden_action?(method_name) || controller.instance_methods.include?(method_name) controller.add_rtml_proxy_action(method_name) end end end end end end