Sha256: 527571ade77896c3378d66ca674a6ecc8c1cd9692db21c65324081ac49fd263d

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

require "core/define"
require "core/extension"
require "core/state"

module Core
  # [public]
  #
  module Factory
    require_relative "factory/version"

    extend Core::Extension

    extends dependencies: [Core::State]

    extends :definition do
      # [public]
      #
      def makes(definable, object, suffix: nil, within: nil)
        unless object.ancestors.include?(Core::Define)
          object.include(Core::Define)
        end

        __makes__[definable.to_sym] = {
          object: object,
          suffix: suffix,
          within: Array(within)
        }
      end

      # [public]
      #
      def make(definable, *namespace, name, **kwargs, &block)
        definable = __makes__.fetch(definable.to_sym)

        if (suffix = definable[:suffix])
          name = :"#{name}_#{suffix}"
        end

        definable[:object].define(*definable[:within], *namespace, name, **kwargs, &block)
      end

      # [public]
      #
      def makes?(definable)
        @__makes__.include?(definable.to_sym)
      end

      # [public]
      #
      def makeables
        @__makes__.keys
      end
    end

    applies do
      state :__makes__, :class, default: {}
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
core-factory-0.2.0 lib/core/factory.rb