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