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)
  prefixes    = _implied_layout_name =~ /\blayouts/ ? [] : ["layouts"]
  name_clause = if name
    <<-RUBY
      lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first || super
    RUBY
  end
  if defined?(@_layout)
    layout_definition = case @_layout
      when String
        @_layout.inspect
      when Symbol
        <<-RUBY
          #{@_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
        RUBY
      when Proc
        define_method :_layout_from_proc, &@_layout
        "_layout_from_proc(self)"
      when false
        nil
      when true
        raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
      when nil
        name_clause
      end
  else
    # Add a deprecation if the parent layout was explicitly set and the child
    # still does a dynamic lookup. In next Rails release, we should @_layout
    # to be inheritable so we can skip the child lookup if the parent explicitly
    # set the layout.
    parent   = self.superclass.instance_variable_get(:@_layout)
    @_layout = nil
    inspect  = parent.is_a?(Proc) ? parent.inspect : parent
    layout_definition = if parent.nil?
        name_clause
      elsif name
        <<-RUBY
          if template = lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first
            ActiveSupport::Deprecation.warn 'Layout found at "#{_implied_layout_name}" for #{name} but parent controller ' \
              'set layout to #{inspect.inspect}. Please explicitly set your layout to "#{_implied_layout_name}" ' \
              'or set it to nil to force a dynamic lookup.'
            template
          else
            super
          end
        RUBY
      end
  end
  self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
    def _layout
      if conditional_layout?
        #{layout_definition}
      else
        #{name_clause}
      end
    end
    private :_layout
  RUBY
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)

* layout - The layout to use.
==== Parameters

nil:: Force default layout behavior with inheritance
true:: raise an ArgumentError
false:: There is no layout
Symbol:: call the method specified by the symbol, which will return the template name
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
  _write_layout_method
end