module ActionView::Layouts::ClassMethods

def _implied_layout_name # :nodoc:

:nodoc:
* 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 # :nodoc:
  controller_path
end

def _write_layout_method # :nodoc:

:nodoc:
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 # :nodoc:
  remove_possible_method(:_layout)
  prefixes    = _implied_layout_name =~ /\blayouts/ ? [] : ["layouts"]
  default_behavior = "lookup_context.find_all('#{_implied_layout_name}', #{prefixes.inspect}, false, [], { formats: formats }).first || super"
  name_clause = if name
    default_behavior
  else
    <<-RUBY
      super
    RUBY
  end
  layout_definition = case _layout
    when String
      _layout.inspect
    when Symbol
      <<-RUBY
        #{_layout}.tap do |layout|
          return #{default_behavior} if layout.nil?
          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
      protected :_layout_from_proc
      <<-RUBY
        result = _layout_from_proc(#{_layout.arity == 0 ? '' : 'self'})
        return #{default_behavior} if result.nil?
        result
      RUBY
    when false
      nil
    when true
      raise ArgumentError, "Layouts must be specified as a String, Symbol, Proc, false, or nil"
    when nil
      name_clause
  end
  self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
    def _layout(formats)
      if _conditional_layout?
        #{layout_definition}
      else
        #{name_clause}
      end
    end
    private :_layout
  RUBY
end

def inherited(klass) # :nodoc:

:nodoc:
def inherited(klass) # :nodoc:
  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(&:to_s) }
  self._layout_conditions = conditions
  self._layout = layout
  _write_layout_method
end