Sha256: 5cde5b45eb464ce8c0d792be3c420148fd55704f5dcb2c8eb09589e2ae16805c

Contents?: true

Size: 1.06 KB

Versions: 4

Compression:

Stored size: 1.06 KB

Contents

# frozen_string_literal: true

require 'singleton'
require 'forwardable'

module Polycrystal
  class Registry
    extend Forwardable
    include Singleton
    include Enumerable

    CrystalModule = Struct.new(:path, :file, :modules, keyword_init: true)

    attr_reader :modules

    def_delegators :@modules, :each

    def initialize
      @modules = []
    end

    def register(path:, file: nil, modules: nil, unshift: false)
      raise ArgumentError, 'include file is requred to wrap modules' if file.nil? && !modules.nil?

      existing = find_module(file: file, path: path)
      if existing
        existing.modules += modules if modules
      else
        new_mod = CrystalModule.new(
          path: path,
          file: file,
          modules: modules
        )
        unshift ? @modules.unshift(new_mod) : @modules.push(new_mod)
      end
    end

    def find_module(path:, file:)
      modules.find { |mod| mod.path == path && mod.file == file }
    end

    class << self
      extend Forwardable

      def_delegators :instance, :register, :modules
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
polycrystal-0.1.3 lib/polycrystal/registry.rb
polycrystal-0.1.2 lib/polycrystal/registry.rb
polycrystal-0.1.1 lib/polycrystal/registry.rb
polycrystal-0.1.0-x86_64-darwin-21 lib/polycrystal/registry.rb