class Hanami::View::Exposures

@api private @since 2.1.0

Attributes

exposures[R]

@api private @since 2.1.0

Public Class Methods

new(exposures = {}) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 20
def initialize(exposures = {})
  @exposures = exposures
end

Public Instance Methods

[](name) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 32
def [](name)
  exposures[name]
end
add(name, proc = nil, **options) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 44
def add(name, proc = nil, **options)
  exposures[name] = Exposure.new(name, proc, **options)
end
bind(obj) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 56
def bind(obj)
  bound_exposures = exposures.each_with_object({}) { |(name, exposure), memo|
    memo[name] = exposure.bind(obj)
  }

  self.class.new(bound_exposures)
end
call(input) { |value, exposure| ... } click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 66
def call(input)
  # Avoid performance cost of tsorting when we don't need it
  names =
    if exposures.values.any?(&:dependencies?) # TODO: this sholud be cachable at time of `#add`
      tsort
    else
      exposures.keys
    end

  names
    .each_with_object({}) { |name, memo|
      next unless (exposure = self[name])

      value = exposure.(input, memo)
      value = yield(value, exposure) if block_given?

      memo[name] = value
    }
    .tap { |hsh|
      names.each do |key|
        hsh.delete(key) if self[key].private?
      end
    }
end
each(&block) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 38
def each(&block)
  exposures.each(&block)
end
import(name, exposure) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 50
def import(name, exposure)
  exposures[name] = exposure.dup
end
key?(name) click to toggle source

@api private @since 2.1.0

# File lib/hanami/view/exposures.rb, line 26
def key?(name)
  exposures.key?(name)
end

Private Instance Methods

tsort_each_child(name, &block) click to toggle source
# File lib/hanami/view/exposures.rb, line 97
def tsort_each_child(name, &block)
  self[name].dependency_names.each(&block) if exposures.key?(name)
end
tsort_each_node(&block) click to toggle source
# File lib/hanami/view/exposures.rb, line 93
def tsort_each_node(&block)
  exposures.each_key(&block)
end