Sha256: 4ba9a8f8e1b30d17e8e8430d16e897b609dd665dbdd039640ecff21eee8b6dae

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

# frozen_string_literal: true

require 'active_support/concern'
require 'active_support/core_ext/class/attribute'
require 'forwardable'

module PlainModel
  module Querying
    module Base
      extend ActiveSupport::Concern

      included do
        class_attribute :chainable_methods, instance_accessor: false, default: []

        class_attribute :result_methods,
                        instance_accessor: false,
                        default: [:to_a, :first, :last, :each, :collect, :map, :select, :detect]

        extend Forwardable
        attr_reader :values
        instance_delegate [:first, :last, :each, :collect, :map, :select, :detect] => :all
        private :_within_new_instance, :_records

        def initialize(*args)
          @values = {}
          super(*args)
        end

        protected

        attr_writer :values
      end

      def to_a
        return @to_a if defined?(@to_a)

        @to_a = _records
      end

      def dup
        new_instance = self.class.new(*dup_args)
        new_instance.values = values.dup
        new_instance
      end

      def dup_args
        []
      end

      def _within_new_instance(&block)
        new_instance = dup
        new_instance.instance_exec(&block)
        new_instance
      end

      def _records
        raise NotImplementedError, "implement #_records private method in #{self.class}"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
plain_model-0.1.0 lib/plain_model/querying/base.rb