 			alpha: alpha
 		)
 	}
+
+
+	@nonobjc
+	public var rgbaComponents: RgbaComponents? {
+		var components = RgbaComponents(red: 0, green: 0, blue: 0, alpha: 0)
+		guard getRed(&components.red, green: &components.green, blue: &components.blue, alpha: &components.alpha) else {
+			return nil
+		}
+
+		return components
+	}
 }



public extension UIColor {

	@nonobjc
	public convenience init(rgb: Int) {


	@nonobjc
	@warn_unused_result
	public func overlayWithColor(overlayColor: UIColor) -> UIColor {
		guard let components = rgbaComponents, overlayComponents = overlayColor.rgbaComponents else {
			return overlayColor
		}

		if components.alpha <= 0 {
			return overlayColor
		}
		if overlayComponents.alpha <= 0 {
			return self
		}
		if overlayComponents.alpha >= 1 {
			return overlayColor
		}

		let fraction = 1 - overlayComponents.alpha
		let overlayFraction = overlayComponents.alpha

		return UIColor(
			red:   (components.red   * fraction) + (overlayComponents.red   * overlayFraction),
			green: (components.green * fraction) + (overlayComponents.green * overlayFraction),
			blue:  (components.blue  * fraction) + (overlayComponents.blue  * overlayFraction),
			alpha: components.alpha
		)
	}


	@nonobjc
	@warn_unused_result
	public static func random(alpha: CGFloat = 1) -> Self {
		return self.init(
			red:   CGFloat(arc4random_uniform(255)) / 255,
