def run!
      git  = nil
      path = nil

      return show_usage() if ARGV.length < 1
      name = ARGV.shift() if ARGV.first[ 0 ] != '-'

      opts = GetoptLong.new(
        [ '--help',    '-h',       GetoptLong::NO_ARGUMENT       ],
        [ '--version', '-v', '-V', GetoptLong::NO_ARGUMENT       ],
        [ '--path',    '-p',       GetoptLong::REQUIRED_ARGUMENT ],
        [ '--from',    '-f',       GetoptLong::REQUIRED_ARGUMENT ],
        [ '--git',     '-g',       GetoptLong::REQUIRED_ARGUMENT ],
      )

      silence_stream( $stderr ) do
        begin
          opts.each do | opt, arg |
            case opt
              when '--help'
                return show_usage()
              when '--version'
                return show_version()
              when '--path'
                path = arg
              when '--from', '--git'
                git = arg
            end
          end

        rescue GetoptLong::InvalidOption, GetoptLong::MissingArgument => e
          return usage_and_warning( e.message )

        end
      end

      unless path.nil? || git.nil?
        return usage_and_warning( 'Use the --path OR --from arguments, but not both' )
      end

      git ||= 'git@github.com:LoyaltyNZ/service_shell.git'

      name = ARGV.shift() if name.nil?
      return show_usage() if name.nil?

      return usage_and_warning( "Unexpected extra arguments were given" ) if ARGV.count > 0
      return usage_and_warning( "SERVICE_NAME must match #{ NAME_REGEX.inspect }" ) if naughty_name?( name )
      return usage_and_warning( "'#{ name }' already exists" ) if File.exist?( "./#{ name }" )

      return create_service( name, git, path )
    end
def run!
      git  = nil
      path = nil

      return show_usage() if ARGV.length < 1
      name = ARGV.shift() if ARGV.first[ 0 ] != '-'

      opts = GetoptLong.new(
        [ '--help',    '-h',       GetoptLong::NO_ARGUMENT       ],
        [ '--version', '-v', '-V', GetoptLong::NO_ARGUMENT       ],
        [ '--path',    '-p',       GetoptLong::REQUIRED_ARGUMENT ],
        [ '--from',    '-f',       GetoptLong::REQUIRED_ARGUMENT ],
        [ '--git',     '-g',       GetoptLong::REQUIRED_ARGUMENT ],
      )

      silence_stream( $stderr ) do
        begin
          opts.each do | opt, arg |
            case opt
              when '--help'
                return show_usage()
              when '--version'
                return show_version()
              when '--path'
                path = arg
              when '--from', '--git'
                git = arg
            end
          end

        rescue GetoptLong::InvalidOption, GetoptLong::MissingArgument => e
          return usage_and_warning( e.message )

        end
      end

      unless path.nil? || git.nil?
        return usage_and_warning( 'Use the --path OR --from arguments, but not both' )
      end

      git ||= 'git@github.com:LoyaltyNZ/service_shell.git'

      name = ARGV.shift() if name.nil?
      return show_usage() if name.nil?

      return usage_and_warning( "Unexpected extra arguments were given" ) if ARGV.count > 0
      return usage_and_warning( "SERVICE_NAME must match #{ NAME_REGEX.inspect }" ) if naughty_name?( name )
      return usage_and_warning( "'#{ name }' already exists" ) if File.exist?( "./#{ name }" )

      return create_service( name, git, path )
    end
Run the +hoodoo+ command implementation. Command line options are
 taken from the Ruby ARGV constant.