     }
 
     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 ""
  }
}


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

  override func expand(# variable:String) -> String {
    return variable
  }

  override func expand(# variable:String, value:String, prefix:Int?) -> String {
    if countElements(value) > 0 {
      let expandedValue = super.expand(variable: variable, value: value, prefix: prefix)
      return "\(variable)=\(expandedValue)"
    }

    return variable
  }
}

