 public extension UIBarButtonItem {
     
     public convenience init(barButtonSystemItem systemItem: UIBarButtonSystemItem, action: ((sender: AnyObject) -> Void)?) {
-        self.init(barButtonSystemItem: systemItem, target: nil, action: #selector(UIButton.performAction))
+        self.init(barButtonSystemItem: systemItem, target: nil, action: #selector(UIBarButtonItem.performAction))
         if let action = action {
             self.closuresWrapper = ClosureWrapper(action: action)
             self.target = self

    }
    
    public convenience init(image: UIImage?, style: UIBarButtonItemStyle, action: ((sender: AnyObject) -> Void)?) {
        self.init(image: image, style: style, target: nil, action: #selector(UIButton.performAction))
        if let action = action {
            self.closuresWrapper = ClosureWrapper(action: action)
            self.target = self

    
}

public extension UIGestureRecognizer {
    
    public convenience init(action: ((sender: AnyObject) -> Void)?) {
        self.init()
        setAction(action)
    }
    
    public func setAction(action: ((sender: AnyObject) -> Void)?) {
        if let action = action {
            self.removeTarget(self, action: nil)
            self.addTarget(self, action: #selector(UIGestureRecognizer.performAction))
            self.closuresWrapper = ClosureWrapper(action: action)
        } else {
            self.removeTarget(self, action: nil)
            self.closuresWrapper = nil
        }
    }
    
    public func performAction() {
        self.closuresWrapper?.action(sender: self)
    }
    
    private var closuresWrapper: ClosureWrapper? {
        get { return objc_getAssociatedObject(self, &_aaak) as? ClosureWrapper }
        set { objc_setAssociatedObject(self, &_aaak, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
    }
    
}

public extension UIControl {
    
    public func setAction(controlEvents controlEvents: UIControlEvents, action: ((sender: AnyObject) -> Void)?) {
        if let action = action {
            self.removeTarget(self, action: nil, forControlEvents: controlEvents)
            self.addTarget(self, action: #selector(UIControl.performAction), forControlEvents: controlEvents)
            self.closuresWrapper = ClosureWrapper(action: action)
        } else {
            self.removeTarget(self, action: nil, forControlEvents: controlEvents)
