 
   func expand(variable:String, value:AnyObject?, explode:Bool, prefix:Int?) -> String {
     if var value:AnyObject = value {
-      var expandedValue:String!
       if let values = value as? [String:AnyObject] {
-        let joiner = explode ? self.joiner : ","
-        let keyValueJoiner = explode ? "=" : ","
-        let elements = map(values, { (key, value) -> String in
-          let expandValue = self.expand(value: "\(value)")
-          return "\(key)\(keyValueJoiner)\(expandValue)"
-        })
-        expandedValue = join(joiner, elements)
+        return expand(variable:variable, value: values, explode: explode)
       } else if let values = value as? [AnyObject] {
-        let joiner = explode ? self.joiner : ","
-        expandedValue = joiner.join(values.map { self.expand(value: "\($0)") })
+        return expand(variable:variable, value: values, explode: explode)
       } else {
-        expandedValue = expand(value:"\(value)", prefix:prefix)
-      }
-
-      return expandedValue
-    }
-
-    return ""
-  }
-
+        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
   }
 
-  func expand(# value:String, prefix:Int?) -> String {
+  // 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)

    }

    return expand(value: value)
  }
}


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

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