Sha256: e59ac0f41c57a991e4fda17fbbdc800cd72fec90f779ff565b616d3ea0eb0fc5

Contents?: true

Size: 1.96 KB

Versions: 3

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true

module N1Loader
  # The module to be included to the class to define associated loaders.
  #
  #   class Example
  #     include N1Loader::Loadable
  #
  #     # with inline loader
  #     n1_loader :something do |elements|
  #       elements.each_with_object({}) do |element, hash|
  #         hash[element] = element.calculate_something
  #       end
  #     end
  #
  #     # with custom loader
  #     n1_loader :something, MyLoader
  #   end
  #
  #   # custom loader
  #   class MyLoader < N1Loader::Loader
  #     def perform(elements)
  #       elements.each_with_object({}) do |element, hash|
  #         hash[element] = element.calculate_something
  #       end
  #     end
  #   end
  module Loadable
    def n1_loader(name)
      send("#{name}_loader")
    end

    def n1_loader_set(name, loader)
      send("#{name}_loader=", loader)
    end

    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods # :nodoc:
      def n1_loader(name)
        send("#{name}_loader")
      end

      def n1_loader_defined?(name)
        respond_to?("#{name}_loader")
      end

      def n1_load(name, loader = nil, &block) # rubocop:disable Metrics/MethodLength
        loader ||= Class.new(N1Loader::Loader) do
          define_method(:perform, &block)
        end

        loader_name = "#{name}_loader"
        loader_variable_name = "@#{loader_name}"

        define_singleton_method(loader_name) do
          loader
        end

        define_method("#{loader_name}=") do |loader_instance|
          instance_variable_set(loader_variable_name, loader_instance)
        end

        define_method(loader_name) do
          instance_variable_get(loader_variable_name) ||
            instance_variable_set(loader_variable_name, self.class.send(loader_name).new([self]))
        end

        define_method(name) do
          send(loader_name).for(self)
        end

        [name, loader_name, loader_variable_name]
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
n1_loader-0.1.2 lib/n1_loader/core/loadable.rb
n1_loader-0.1.1 lib/n1_loader/loadable.rb
n1_loader-0.1.0 lib/n1_loader/loadable.rb