module Data2ruby::ClassMethods

Private Class Methods

name() click to toggle source
# File lib/data2ruby.rb, line 49
def self.name
  'AnonAssociation'
end

Public Instance Methods

associations() click to toggle source
# File lib/data2ruby.rb, line 9
def associations
  @_associations ||= []
end
has_many(label, &block) click to toggle source
# File lib/data2ruby.rb, line 25
def has_many(label, &block)
  attr_writer(label)
  associations << label
  klass = build_assoc_class(&block)
  assoc_instance_builder = build_assoc_instance_builder(klass)
  inst_var_memo = "@_has_many_#{label}"

  define_method(label) do
    memoize(inst_var_memo) do
      data[label].map do |item|
        assoc_instance_builder.(item)
      end
    end
  end
end
has_one(label, &block) click to toggle source
# File lib/data2ruby.rb, line 13
def has_one(label, &block)
  attr_writer(label)
  associations << label
  klass = build_assoc_class(&block)
  assoc_instance_builder = build_assoc_instance_builder(klass)
  inst_var_memo = "@_has_one_#{label}"

  define_method(label) do
    memoize(inst_var_memo) { assoc_instance_builder.(data[label]) }
  end
end

Private Instance Methods

build_assoc_class(&block) click to toggle source
# File lib/data2ruby.rb, line 43
def build_assoc_class(&block)
  Class.new do
    include ActiveModel::Model
    include Data2ruby
    extend ActiveModel::Naming

    def self.name
      'AnonAssociation'
    end

    def name
      self.class.name
    end
  end
    .tap { |klass| klass.class_exec(&block) }
end
build_assoc_instance_builder(klass) click to toggle source
# File lib/data2ruby.rb, line 60
def build_assoc_instance_builder(klass)
  lambda do |data|
    klass.new(data).tap do |obj|
      obj.define_singleton_method(:data) { data }
    end
  end
end
name() click to toggle source
# File lib/data2ruby.rb, line 53
def name
  self.class.name
end