module AbstractController::Layouts::ClassMethods

def _implied_layout_name

* String - A template name
==== Returns

value of this method.
If no layout is supplied, look for a template named the return
def _implied_layout_name
  controller_path
end

def _write_layout_method

if nothing is found then try same procedure to find super class's layout.
If a layout is not explicitly mentioned then look for a layout with the controller's name.

Creates a _layout method to be called by _default_layout .
def _write_layout_method
  remove_possible_method(:_layout)
  case defined?(@_layout) ? @_layout : nil
  when String
    self.class_eval %{def _layout; #{@_layout.inspect} end}, __FILE__, __LINE__
  when Symbol
    self.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
      def _layout
        #{@_layout}.tap do |layout|
          unless layout.is_a?(String) || !layout
            raise ArgumentError, "Your layout method :#{@_layout} returned \#{layout}. It " \
              "should have returned a String, false, or nil"
          end
        end
      end
    ruby_eval
  when Proc
    define_method :_layout_from_proc, &@_layout
    self.class_eval %{def _layout; _layout_from_proc(self) end}, __FILE__, __LINE__
  when false
    self.class_eval %{def _layout; end}, __FILE__, __LINE__
  when true
    raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
  when nil
    if name
      _prefix = "layouts" unless _implied_layout_name =~ /\blayouts/
      self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def _layout
          if template_exists?("#{_implied_layout_name}", #{_prefix.inspect})
            "#{_implied_layout_name}"
          else
            super
          end
        end
      RUBY
    end
  end
  self.class_eval { private :_layout }
end

def inherited(klass)

def inherited(klass)
  super
  klass._write_layout_method
end

def layout(layout, conditions = {})

* :except - Apply this layout to all actions but this one.
* :only - A list of actions to apply this layout to.
==== Options (conditions)

* String, Symbol, false - The layout to use.
==== Parameters

true:: raise an ArgumentError
false:: There is no layout
the template name
Symbol:: call the method specified by the symbol, which will return
String:: the String is the template name
If the specified layout is a:

Specify the layout to use for this class.
def layout(layout, conditions = {})
  include LayoutConditions unless conditions.empty?
  conditions.each {|k, v| conditions[k] = Array(v).map {|a| a.to_s} }
  self._layout_conditions = conditions
  @_layout = layout || false # Converts nil to false
  _write_layout_method
end