Implementation details described in #5
Implementation details described in #5