class Browser

def self.modern_rules


Browser.modern_rules << -> b { b.chrome? && b.version >= '37' }
Browser.modern_rules.clear
# Only Chrome Canary is considered modern.

To redefine all rules, clear the existing rules before adding your own.

=== and accepts the browser object.
A rule must be a proc/lambda or any object that implements the method
Define the rules which define a modern browser.
def self.modern_rules
  @modern_rules ||= []
end

def chrome?

Detect if browser is Chrome.
def chrome?
  ua =~ /Chrome|CriOS/ && !opera? && !edge?
end

def core_media?

Detect if browser is Apple CoreMedia.
def core_media?
  !!(ua =~ /CoreMedia/)
end

def edge?

Detect if browser is Microsoft Edge.
def edge?
  !!(ua =~ /Windows.*?\bEdge\/\d+/)
end

def firefox?

Detect if browser is Firefox.
def firefox?
  !!(ua =~ /Firefox/)
end

def full_version

Return the full version.
def full_version
  _, *v = *ua.match(VERSIONS.fetch(id, VERSIONS[:default]))
  v.compact.first || "0.0"
end

def id

Get the browser identifier.
def id
  NAMES.keys
    .find {|id| respond_to?("#{id}?") ? public_send("#{id}?") : id }
end

def initialize(options = {}, &block)


})
:accept_language => "pt-br"
:ua => "Safari",
browser = Browser.new({

the UA and Accept-Language headers.
Create a new browser instance and set
def initialize(options = {}, &block)
  self.user_agent = (options[:user_agent] || options[:ua]).to_s
  self.accept_language = options[:accept_language].to_s
  yield self if block
end

def known?

def known?
  id != :other
end

def meta

Return a meta info about this browser.
def meta
  Meta.constants.each_with_object(Set.new) do |meta_name, meta|
    meta_class = Meta.const_get(meta_name)
    meta.merge(meta_class.new(self).to_a)
  end.to_a
end

def modern?

Return true if browser is modern (Webkit, Firefox 17+, IE9+, Opera 12+).
def modern?
  self.class.modern_rules.any? {|rule| rule === self }
end

def name

Get readable browser name.
def name
  NAMES[id]
end

def opera?

Detect if browser is Opera.
def opera?
  !!(ua =~ /(Opera|OPR)/)
end

def phantom_js?

Detect if browser is PhantomJS
def phantom_js?
  !!(ua =~ /PhantomJS/)
end

def quicktime?

Detect if browser is QuickTime
def quicktime?
  !!(ua =~ /QuickTime/i)
end

def safari?

Detect if browser is Safari.
def safari?
  (ua =~ /Safari/ || safari_webapp_mode?) && ua !~ /Android|Chrome|CriOS|PhantomJS/
end

def safari_webapp_mode?

def safari_webapp_mode?
  (ipad? || iphone?) && ua =~ /AppleWebKit/
end

def silk?

Detect if browser is Silk.
def silk?
  !!(ua =~ /Silk/)
end

def to_s

Return meta representation as string.
def to_s
  meta.to_a.join(" ")
end

def version

Return major version.
def version
  full_version.to_s.split(".").first
end

def webkit?

Detect if browser is WebKit-based.
def webkit?
  ua =~ /AppleWebKit/i && !edge?
end