class Hanami::View::ScopeBuilder

Builds scope objects via matching classes

@api public @since 2.1.0

Public Class Methods

call(name = nil, locals:, rendering:) click to toggle source

Returns a new scope using a class matching the name.

@param name [Symbol, Class] scope name @param locals [Hash<Symbol, Object>] locals hash

@return [Hanami::View::Scope]

@api public @since 2.1.0

# File lib/hanami/view/scope_builder.rb, line 20
def call(name = nil, locals:, rendering:) # rubocop:disable Style/OptionalArguments
  klass = scope_class(name, rendering: rendering)

  klass.new(name: name, locals: locals, rendering: rendering)
end

Private Class Methods

resolve_scope_class(name:, rendering:) click to toggle source
# File lib/hanami/view/scope_builder.rb, line 40
def resolve_scope_class(name:, rendering:)
  name = rendering.inflector.camelize(name.to_s)

  namespace = rendering.config.scope_namespace

  # Give autoloaders a chance to act
  begin
    klass = namespace.const_get(name)
  rescue NameError # rubocop:disable Lint/HandleExceptions
  end

  if !klass && namespace.const_defined?(name, false)
    klass = namespace.const_get(name)
  end

  if klass && klass < Scope
    klass
  else
    rendering.config.scope_class
  end
end
scope_class(name = nil, rendering:) click to toggle source
# File lib/hanami/view/scope_builder.rb, line 28
def scope_class(name = nil, rendering:)
  if name.nil?
    rendering.config.scope_class
  elsif name.is_a?(Class)
    name
  else
    View.cache.fetch_or_store(:scope_class, rendering.config) do
      resolve_scope_class(name: name, rendering: rendering)
    end
  end
end