Support for naming strategies (snake_case)

Implementation for #393
does name make sense here rather than rename? Also why not just return an ```Optional<String>`` and have the caller figure out if they need to use a default value instead, rather than pass in a default (currentName)