anchor.diff:      return result;
     }
   
  +  /**
  +   * How many parts this path is composed of?
  +   */
     int get length {
       return parts.length;
     }
   
  -  String getPathParams(String url) {
  -
  -  }
  -
  -  bool hasPathParam() {
  -    bool result = false;
  -
  -    for (var i = 0;i < parts.length; i++) {
  -      if (parts[i].indexOf(":") > 0) {
  -        result = true;
  -        break;
  -      }
  +  /**
  +   * Join two paths.
  +   */
  +  Path join(Path path) {
  +    if(path == null) {
  +      throw new ArgumentError();
       }
   
  -    return result;
  -  }
  -
  -  Path join(Path path) {
       Path result = new Path();
       parts.forEach((p) => result.parts.add(p));
       path.parts.forEach((p) => result.parts.add(p));
  
positive.code:   Path() {
    }
  
    Path.fromString(String path) {
      for (String part in path.split("/")) {
        if (part != null && !part.isEmpty) parts.add(part);
      }
    }
  
    Path subPath({int start, int end}) {
      Path result = null;
  
      if (start != null) {
        if(parts.getRange(start, end).length > 0){
          result = new Path();
          parts.getRange(start, end).forEach((String p) => result.parts.add(p));
        }
  
negative.code: library darter.http.path;
  
  /**
   * Its main goals is to turn it easy to:
   * 1. compare whether two paths are equal or not.
   *  2. get subpaths from paths.
   *  3. efficiently handle path parts.
   */
  class Path {
    List<String> parts = [];
  