module Hanami::SliceConfigurable

Calls ‘configure_for_slice(slice)` on the extended class whenever it is first subclassed within a module namespace corresponding to a slice.

@example

class BaseClass
  extend Hanami::SliceConfigurable
end

# slices/main/lib/my_class.rb
module Main
  class MyClass < BaseClass
    # Will be called with `Main::Slice`
    def self.configure_for_slice(slice)
      # ...
    end
  end
end

@api private @since 2.0.0

Public Class Methods

extended(klass) click to toggle source
Calls superclass method
# File lib/hanami/slice_configurable.rb, line 29
def extended(klass)
  slice_for = method(:slice_for)

  inherited_mod = Module.new do
    define_method(:inherited) do |subclass|
      unless Hanami.app?
        raise ComponentLoadError, "Class #{klass} must be defined within an Hanami app"
      end

      super(subclass)

      subclass.instance_variable_set(:@configured_for_slices, configured_for_slices.dup)

      slice = slice_for.(subclass)
      return unless slice

      unless subclass.configured_for_slice?(slice)
        subclass.configure_for_slice(slice)
        subclass.configured_for_slices << slice
      end
    end
  end

  klass.singleton_class.prepend(inherited_mod)
end

Private Class Methods

slice_for(klass) click to toggle source
# File lib/hanami/slice_configurable.rb, line 57
def slice_for(klass)
  return unless klass.name

  slices = Hanami.app.slices.with_nested + [Hanami.app]

  slices.detect { |slice| klass.name.start_with?("#{slice.namespace}#{MODULE_DELIMITER}") }
end

Public Instance Methods

configure_for_slice(slice) click to toggle source
# File lib/hanami/slice_configurable.rb, line 66
def configure_for_slice(slice); end
configured_for_slice?(slice) click to toggle source
# File lib/hanami/slice_configurable.rb, line 68
def configured_for_slice?(slice)
  configured_for_slices.include?(slice)
end
configured_for_slices() click to toggle source
# File lib/hanami/slice_configurable.rb, line 72
def configured_for_slices
  @configured_for_slices ||= []
end