@movitto I like this better but I think the specific Distro should be responsible for detecting itself.

Maybe something like this?  We can do this in a follow-up pull request if want.

```ruby
module Distros
  class Distro
    ETC_ISSUE_KEYWORDS = []
    RELEASE_FILE = ''
    LIST_OF_DETECTABLE_DISTROS = %w(Ubuntu Fedora RHEL)  # this be done programmatically

    def self.etc_issue
      @etc_issue ||=  File.read('/etc/issue') unless File.exists?('/etc/issue')
    end

    def self.etc_issue_keywords
      self::ETC_ISSUE_KEYWORDS
    end

    def self.local
      @local ||= begin
        LIST_OF_DETECTABLE_DISTROS.each do |distro|
          distro = Distros.const_get(distro)
          return distro.new if distro.detected?
        end
        Distros.generic
      end
    end

    def self.detected?
      detected_by_etc_issue? || detected_by_etc_release?
    end

    def self.detected_by_etc_issue?
      etc_issue_keywords.any? {|k| etc_issue.include?(k)}
    end

    def self.release_file
      self::RELEASE_FILE
    end

    def self.detected_by_etc_release?
      File.exists?(release_file)
    end
  end

  class RHEL < Distro
    RELEASE_FILE =       "/etc/redhat-release"
    ETC_ISSUE_KEYWORDS = ['red hat', 'Red Hat', 'centos']
  end

  class Ubuntu < Distro
    # TODO
  end

  class Fedora < Distro
    # TODO
  end
end
```