function AJAXFluentInterface(uri) {

  this.uri = uri || "";

  this.retrieve = function(data, type) {
    return $.ajax({
      type: type || "GET",
      url: this.uri,
      dataType: "json",
      data: data
    })
  };

  this.registerEndpoint = function(endpoint, methods) {

    if (endpoint == "") {
      return;
    }

    var splittedEndpoint = endpoint.split("/");
    methods = methods || ["GET"];

    if (splittedEndpoint[0] == "") {
      splittedEndpoint.splice(0, 1);
    }

    var part = splittedEndpoint[0];

    if (this[part] === undefined) {
      this[part] = new AJAXFluentInterface([this.uri, part].join("/"));
    }

    for (i in methods) {
      this[part][methods[i].toLowerCase()] = function(data) {
        return this.retrieve(data, methods[i]);
      }
    }

    splittedEndpoint.splice(0, 1);
    this[part].registerEndpoint(splittedEndpoint.join("/"), methods);

  };

  this.compile = function() {

    /* TODO
      Concept:
      registerEndpoint("/foo/bar")
      -> .foo.bar == .foo.bar.get
    */

  }

}

application = new AJAXFluentInterface();

application.registerEndpoint("/auth/Login", ["POST"]);
application.registerEndpoint("/auth/Logout");
application.registerEndpoint("/auth/foo/bar/baz/xpto/ximbica");

console.log(application);
console.log(application.auth.uri);
console.log(application.auth.Login.uri);
console.log(application.auth.Logout.uri);
console.log(application.auth.foo.bar.baz.xpto.ximbica.uri);

application.auth.Login.post({username: "admin", password: "admin"}).done(function(e) {
  console.log(e);
});

application.auth.Logout.get().done(function(e) {
  console.log(e);
});

application.auth.get().done(function(e) {
  console.log(e);
});