Sha256: 7ddf6118f74651ec1910f8ad70a2c406074ae8e277eeadfbda42b5a279b3df76

Contents?: true

Size: 1.87 KB

Versions: 5

Compression:

Stored size: 1.87 KB

Contents

require "virtus"
require "active_support/inflector"
require "active_support/core_ext/object/try"

module DataBroker
  def self.value_object
    Module.new do
      def self.included(descendant)
        descendant.send(:include, ::DataBroker::ValueObject)
      end
    end
  end

  module ValueObject
    def self.included(descendant)
      descendant.send(:include, Virtus.value_object)
      descendant.send(:include, ActiveSupport::Inflector)
      descendant.extend(ClassMethods)
    end

    module ClassMethods
      include ActiveSupport::Inflector

      def belongs_to(method)
        mapper = "#{camelize(method.to_s)}Mapper"
        via = foreign_key(camelize(method.to_s))

        define_method(method) do
          ivar = "@#{method}"
          instance_variable_get(ivar) || instance_variable_set(
            ivar, constantize(mapper).find(self.send(via))
          )
        end
      end

      def has_many(method)
        mapper = "#{classify(method.to_s)}Mapper"
        via = foreign_key(self.to_s)
        ids_method = pluralize(foreign_key(classify(method.to_s)))

        define_method(method) do
          ivar = "@#{method}"
          instance_variable_get(ivar) || -> {
            instance_variable_set("@#{ids_method}", nil)
            instance_variable_set(
              ivar, constantize(mapper).where(via.to_sym => self.id)
            )
          }.call
        end

        define_method(ids_method) do
          ivar = "@#{ids_method}"
          instance_variable_get(ivar) || instance_variable_set(
            ivar, send(method).map(&:id)
          )
        end
      end

      def delegate(method, to: nil)
        delegated = "#{to}_#{method}"
        define_method(delegated) do
          ivar = "@#{delegated}"
          instance_variable_get(ivar) || instance_variable_set(
            ivar, send(to).try(method)
          )
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
data_broker-0.3.0 lib/data_broker/value_object.rb
data_broker-0.2.3 lib/data_broker/value_object.rb
data_broker-0.2.2 lib/data_broker/value_object.rb
data_broker-0.2.1 lib/data_broker/value_object.rb
data_broker-0.2.0 lib/data_broker/value_object.rb