ProgrammingRubyThePragmaticProgrammers’GuideSecondEditionDaveThomaswithChadFowlerandAndyHun