optimised for ruby 2.0