class Browser::Platform

def self.matchers

Order is important.
Hold the list of platform matchers.
def self.matchers
  @matchers ||= [
    AdobeAir,
    ChromeOS,
    WindowsMobile,
    WindowsPhone,
    Android,
    BlackBerry,
    IOS,
    Mac,
    KaiOS,
    FirefoxOS,
    Windows,
    Linux,
    Unknown
  ]
end

def ==(other)

def ==(other)
  id == other
end

def adobe_air?(expected_version = nil)

def adobe_air?(expected_version = nil)
  id == :adobe_air && detect_version?(version, expected_version)
end

def android?(expected_version = nil)

def android?(expected_version = nil)
  id == :android && detect_version?(version, expected_version)
end

def android_app?

https://developer.chrome.com/multidevice/user-agent#webview_user_agent
Detect if in an Android app webview (Lollipop and newer)
def android_app?
  android? && ua.match?(/\bwv\b/)
end

def blackberry?(expected_version = nil)

def blackberry?(expected_version = nil)
  id == :blackberry && detect_version?(version, expected_version)
end

def chrome_os?(expected_version = nil)

def chrome_os?(expected_version = nil)
  id == :chrome_os && detect_version?(version, expected_version)
end

def firefox_os?

def firefox_os?
  id == :firefox_os
end

def id

def id
  subject.id
end

def initialize(ua)

def initialize(ua)
  @ua = ua
end

def ios?(expected_version = nil)

def ios?(expected_version = nil)
  id == :ios && detect_version?(version, expected_version)
end

def ios_app?

Detect if running on iOS app webview.
def ios_app?
  ios? && !ua.include?("Safari")
end

def ios_webview?

Detect if is iOS webview.
def ios_webview?
  ios_app?
end

def kai_os?

def kai_os?
  id == :kai_os
end

def linux?

def linux?
  id == :linux
end

def mac?(expected_version = nil)

def mac?(expected_version = nil)
  id == :mac && detect_version?(version, expected_version)
end

def name

def name
  subject.name
end

def subject

def subject
  @subject ||= self.class.matchers
                   .map {|matcher| matcher.new(ua, self) }
                   .find(&:match?)
end

def to_s

def to_s
  id.to_s
end

def unknown?

def unknown?
  id == :unknown_platform
end

def version

def version
  subject.version
end

def windows10?

def windows10?
  windows? && ua.include?("Windows NT 10")
end

def windows7?

def windows7?
  windows? && ua.include?("Windows NT 6.1")
end

def windows8?

def windows8?
  windows? && ua.match?(/Windows NT 6\.[2-3]/)
end

def windows8_1?

def windows8_1?
  windows? && ua.include?("Windows NT 6.3")
end

def windows?(expected_version = nil)

def windows?(expected_version = nil)
  id == :windows && detect_version?(version, expected_version)
end

def windows_mobile?(expected_version = nil)

def windows_mobile?(expected_version = nil)
  id == :windows_mobile && detect_version?(version, expected_version)
end

def windows_phone?(expected_version = nil)

def windows_phone?(expected_version = nil)
  id == :windows_phone && detect_version?(version, expected_version)
end

def windows_rt?

def windows_rt?
  windows8? && ua.include?("ARM")
end

def windows_touchscreen_desktop?

def windows_touchscreen_desktop?
  windows? && ua.include?("Touch")
end

def windows_vista?

def windows_vista?
  windows? && ua.include?("Windows NT 6.0")
end

def windows_wow64?

def windows_wow64?
  windows? && ua.match?(/WOW64/i)
end

def windows_x64?

Detect if current platform is Windows in 64-bit architecture.
def windows_x64?
  windows? && ua.match?(/(Win64|x64|Windows NT 5\.2)/)
end

def windows_x64_inclusive?

def windows_x64_inclusive?
  windows_x64? || windows_wow64?
end

def windows_xp?

http://msdn.microsoft.com/fr-FR/library/ms537503.aspx#PltToken
def windows_xp?
  windows? && ua.match?(/Windows NT 5\.[12]/)
end