     }
 
     return expand(value: value)
+  }
+
+  // Point to overide to expanding an array
+  func expand(# variable:String, value:[AnyObject], explode:Bool) -> String {
+    let joiner = explode ? self.joiner : ","
+    return joiner.join(value.map { self.expand(value: "\($0)") })
+  }
+
+  // Point to overide to expanding a dictionary
+  func expand(# variable:String, value:[String:AnyObject], explode:Bool) -> String {
+    let joiner = explode ? self.joiner : ","
+    let keyValueJoiner = explode ? "=" : ","
+    let elements = map(value, { (key, value) -> String in
+      let expandValue = self.expand(value: "\(value)")
+      return "\(key)\(keyValueJoiner)\(expandValue)"
+    })
+    return join(joiner, elements)
+  }
+
+  // Point to overide when value not found
+  func expand(# variable:String) -> String {
+    return ""
   }
 }
 

  var prefix:String { return "&" }
  override var joiner:String { return "&" }

  override func expand(variable:String, value:AnyObject?, explode:Bool, prefix:Int?) -> String {
    if let value:AnyObject = value {
      let expandedValue = expand(value:"\(value)", prefix:prefix)
      return "\(variable)=\(expandedValue)"
    }

    return ""
  }
}


  func expand(variable:String, value:AnyObject?, explode:Bool, prefix:Int?) -> String {
    if var value:AnyObject = value {
      if let values = value as? [String:AnyObject] {
        return expand(variable:variable, value: values, explode: explode)
      } else if let values = value as? [AnyObject] {
        return expand(variable:variable, value: values, explode: explode)
      } else {
        return expand(variable:variable, value:"\(value)", prefix:prefix)
      }
    }

    return expand(variable:variable)
  }

  // Point to overide to expand a value (i.e, perform encoding)
  func expand(# value:String) -> String {
    return value
  }

  // Point to overide to expanding a string
  func expand(# variable:String, value:String, prefix:Int?) -> String {
    if let prefix = prefix {
      if countElements(value) > prefix {
        let index = advance(value.startIndex, prefix)
