re-implement without Boost and allow no argument