class Klassy::Klassic
Attributes
parent[RW]
Public Class Methods
klassify(options = {}, &block)
click to toggle source
# File lib/klassy/klassic.rb, line 12 def self.klassify(options = {}, &block) klassic = new(options) klassic.instance_eval(&block) end
new(options = {})
click to toggle source
# File lib/klassy/klassic.rb, line 8 def initialize(options = {}) @parent = options[:parent] end
Private Instance Methods
add_nested_object(object_name, object)
click to toggle source
# File lib/klassy/klassic.rb, line 36 def add_nested_object(object_name, object) parent.instance_eval do if respond_to? object_name eval(object_name.to_s) << object else instance_variable_set "@#{object_name}", [object] self.class.class_eval do attr_accessor object_name end end end end
attributes()
click to toggle source
# File lib/klassy/klassic.rb, line 63 def attributes instance_values end
create_object(klass, name, attribs)
click to toggle source
# File lib/klassy/klassic.rb, line 49 def create_object(klass, name, attribs) obj = klass.new if attribs obj.instance_eval do attribs.each do |key, val| instance_variable_set "@#{key}", val klass.class_eval do attr_accessor key end end end end obj.class.class_eval do def attributes instance_values end end obj end
find_or_create_class(name)
click to toggle source
# File lib/klassy/klassic.rb, line 71 def find_or_create_class(name) begin Klassy.const_get("#{name.to_s.camelize}") rescue Klassy.const_set("#{name.to_s.camelize}", Class.new do include ::ActiveModel::Serializers::JSON include ::ActiveModel::Serializers::Xml end) end end
method_missing(name, *args, &block)
click to toggle source
# File lib/klassy/klassic.rb, line 19 def method_missing(name, *args, &block) # find or create the class klass = find_or_create_class(name) # create the object attribs = args.find{|x| x.class == Hash } obj = create_object(klass, name, attribs) # if there's a parent, make this object one of it's children add_nested_object(name, obj) if parent # if block_given? then we have more objects to create. Klassic.klassify({parent: obj}, &block) if block_given? obj end