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