http://www.oak.hk/blog/2014/09/19/enforce-the-singleton-property-with-a-private-constructor-or-an-enum-type/