class NiceHash
  ##################################################
  #  Deep clones the supplied object
  #
  #  @param obj [Object] The object we want to deep clone
  #
  #  @return [Object]
  #
  #  @example
  #  my_hash = { user: {
  #                      address: {
  #                             city: 'Madrid',
  #                             country: 'Spain'
  #                          },
  #                      name: 'Peter',
  #                      age: 33
  #                    },
  #              customer: true
  #  }
  #    NiceHash.deep_clone(my_hash)
  #    #>{:user=>{:address=>{:city=>"Madrid", :country=>"Spain"}, :name=>"Peter", :age=>33}, :customer=>true}
  ##################################################
  def self.deep_clone(obj)
    obj.clone.tap do |new_obj|
      if new_obj.is_a?(Array)
        new_obj.each_with_index do |val, i|
          new_obj[i] = deep_clone(val)
        end
      elsif new_obj.is_a?(Hash)
        new_obj.each do |key, val|
          new_obj[key] = deep_clone(val)
        end
      else
        new_obj = obj.clone
      end
    end
  end
end