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