lib/json_serializer.rb in json-serializer-0.0.6 vs lib/json_serializer.rb in json-serializer-0.0.7

- old
+ new

@@ -1,52 +1,104 @@ -require_relative 'json-serializer' +require "json" + +class JsonSerializer + module Utils + def self.const(context, name) + case name + when Symbol, String + context.const_get(name) + else name + end + end + end + + def self.attribute(name, serializer = nil) + attributes[name] ||= serializer + end + + def self.attributes + @attributes ||= {} + end + + attr :object + + def initialize(object) + @object = object + end + + def to_json(options={}) + if root = options[:root] + { root => serializable_object }.to_json + else + serializable_object.to_json + end + end + + protected + + def serializable_object + if object.kind_of?(Enumerable) + object.to_a.map { |item| self.class.new(item).to_hash } + else + to_hash + end + end + + def to_hash + self.class.attributes.each_with_object({}) do |(name, serializer), hash| + data = self.class.method_defined?(name) ? self.send(name) : object.send(name) + data = Utils.const(self.class, serializer).new(data).serializable_object if serializer + hash[name] = data + end + end +end