learned from http://www.nczonline.net/blog/2014/01/21/private-instance-members-with-weakmaps-in-javascript/?utm_content=buffercc39d&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer