class DeviantArt::Base

Base of response class

Attributes

attrs[R]

Public Class Methods

new(attrs) click to toggle source

Build response object from JSON data

# File lib/deviantart/base.rb, line 9
def initialize(attrs)
  @attrs = attrs
  define_hash_attrs(self, @attrs, [])
end
point_to_class(point, klass) click to toggle source

Set nested point by Array to specified klass.

# File lib/deviantart/base.rb, line 21
def point_to_class(point, klass)
  self.points_class_mapping[point] = klass
end
points_class_mapping() click to toggle source
# File lib/deviantart/base.rb, line 15
def points_class_mapping
  @points_class_mapping ||= {}
end

Public Instance Methods

to_s() click to toggle source
# File lib/deviantart/base.rb, line 26
def to_s
  self.class.name
end

Private Instance Methods

attr_accessor_with_receiver(receiver, name) click to toggle source
# File lib/deviantart/base.rb, line 38
        def attr_accessor_with_receiver(receiver, name)
  receiver.instance_eval do
    reader_name = name.to_sym
    writer_name = :"#{name}="
    variable_name = :"@#{name}"
    if !receiver.respond_to?(reader_name)
      define_singleton_method(reader_name, proc { |dummy=nil| instance_variable_get(variable_name) })
    end
    if !receiver.respond_to?(writer_name)
      define_singleton_method(writer_name, method(:instance_variable_set).to_proc.curry.(variable_name))
    end
  end
end
define_array_attrs(array, attrs, point) click to toggle source
# File lib/deviantart/base.rb, line 52
        def define_array_attrs(array, attrs, point)
  attrs.each do |value|
    array << nested_value(value, point)
  end
  array
end
define_hash_attrs(receiver, attrs, point) click to toggle source
# File lib/deviantart/base.rb, line 30
        def define_hash_attrs(receiver, attrs, point)
  attrs.each_pair do |key, value|
    attr_accessor_with_receiver(receiver, key)
    receiver.instance_variable_set(:"@#{key}", nested_value(value, point + [key.to_sym]))
  end
  receiver
end
nested_value(value, point) click to toggle source
# File lib/deviantart/base.rb, line 59
        def nested_value(value, point)
  if self.class.points_class_mapping.include?(point)
    self.class.points_class_mapping[point].new(value)
  else
    case value
    when Array
      define_array_attrs(Array.new, value, point + [:[]])
    when Hash
      define_hash_attrs(Object.new, value, point)
    else
      value
    end
  end
end