module ActionView::Layouts::ClassMethods

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:
  silence_redefinition_of_method(:_layout)
  prefixes = /\blayouts/.match?(_implied_layout_name) ? [] : ["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
      private :_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
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
    # frozen_string_literal: true
    def _layout(lookup_context, formats)
      if _conditional_layout?
        #{layout_definition}
      else
        #{name_clause}
      end
    end
    private :_layout
  RUBY
end