     return expression!
   }
 
-  var operators:[String] {
-    return ["+", "#", ".", "/", ";", "?", "&", "|", "!", "@"]
+  var operators:[Operator] {
+    return [
+      StringExpansion(),
+      ReservedExpansion(),
+      FragmentExpansion(),
+      LabelExpansion(),
+      PathSegmentExpansion(),
+      PathStyleParameterExpansion(),
+      FormStyleQueryExpansion(),
+      FormStyleQueryContinuation(),
+    ]
   }
 
   public init(template:String) {


  /// Expand template as a URI Template using the given variables
  public func expand(variables:[String:AnyObject]) -> String {
    let operatorHandlers:Dictionary<String, Expander> = [
      "+": Expander(prefix: "", joiner: ",", expandPercentEscaped),
      "#": Expander(prefix: "#", joiner: ",", expandPercentEscaped),
      ".": Expander(prefix: ".", joiner: ".", expandValue),
      ";": Expander(prefix: ";", joiner: ";", { (key, string) -> String in
        if let string = string {
          if countElements(string) > 0 {
            return "\(key)=\(string)"
          }
        }

        return "\(key)"
      }),
      "&": Expander(prefix: "&", joiner: "&", expandKeyValue),
      "?": Expander(prefix: "?", joiner: "&", expandKeyValue),
      "/": Expander(prefix: "/", joiner: "/", expandValue),
    ]

    return regex.substitute(template) { string in
      var expression = string.substringWithRange(string.startIndex.successor()..<string.endIndex.predecessor())

      let firstCharacter = expression.substringToIndex(expression.startIndex.successor())
      var expander:Expander! = operatorHandlers[firstCharacter]

      if let expander = expander {
        expression = expression.substringFromIndex(expression.startIndex.successor())
      } else {
        expander = Expander(prefix: "", joiner: ",", expandPercentEncoded)
      }

      return expander.prefix + expander.joiner.join(expression.componentsSeparatedByString(",").map { variable -> String in
        if let value: AnyObject = variables[variable] {
          return expander.handler(variable, "\(value)")
        }

        return expander.handler(variable, nil)
      })
    }
  }

      var expression = expression

      for op in self.operators {
        if let op = op.op {
          if expression.hasPrefix(op) {
            expression = expression.substringFromIndex(expression.startIndex.successor())
            break
          }
        }
      }

