Sha256: 37d7377e48fcd58f44afea3e3b2f075ae763788defdc2f37aca62ca5e5b0e437

Contents?: true

Size: 1.32 KB

Versions: 7

Compression:

Stored size: 1.32 KB

Contents

require "json"

module Baleen
  module Serializable

    def self.deserialize(json_string)
      params = JSON.parse(json_string)
      klass = params.delete "klass"
      Object.const_get(klass).new(symbolize_keys(params))
    end

    def self.symbolize_keys(hash)
      hash.inject({}){|new_hash, key_value|
        key, value = key_value
        value = symbolize_keys(value) if value.is_a?(Hash)
        new_hash[key.to_sym] = value
        new_hash
      }
    end

    # Dynamically define getter and setter for keys of @params
    def method_missing(name, *args)
      _name = name.to_s.sub("=", "")

      if @params.has_key?(_name.to_sym)
        self.class.class_eval{
          define_method "#{_name}" do
            @params[_name.to_sym]
          end
        }
        self.class.class_eval{
          define_method "#{_name}=" do |*args|
           @params[_name.to_sym] = args.first
          end
        }
        if name.to_s[-1, 1] == "="
          send(name, args.first)
        else
          send(name)
        end
      else
        raise NoMethodError.new("undefined method: #{name}", name, args)
      end
    end

    def params
      @params
    end

    def to_json
      @params.to_json
    end

    def dup
      copy_params = @params.dup
      Object.const_get(self.class.to_s).new(copy_params)
    end

  end

end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
baleen-0.2.5 lib/baleen/serializable.rb
baleen-0.2.4 lib/baleen/serializable.rb
baleen-0.2.3 lib/baleen/serializable.rb
baleen-0.2.2 lib/baleen/serializable.rb
baleen-0.2.1 lib/baleen/serializable.rb
baleen-0.2.0 lib/baleen/serializable.rb
baleen-0.1.2 lib/baleen/serializable.rb