Add full JavaDoc and add API with interfaces so users don't have to deal with the raw classes