Show:
                            var Lang = A.Lang;
                            
                            /**
                             * Widget extension, which can be used to add trigger support to the
                             * base Widget class, through the [Base.build](Base.html#method_build) method.
                             *
                             * @class A.WidgetTrigger
                             * @param {Object} The user configuration object
                             */
                            
                            function WidgetTrigger() {}
                            
                            /**
                             * Static property used to define the default attribute
                             * configuration.
                             *
                             * @property ATTRS
                             * @type Object
                             * @static
                             */
                            WidgetTrigger.ATTRS = {
                                /**
                                 * Determine if the Toggler should bind DOM events or not.
                                 *
                                 * @attribute bindDOMEvents
                                 * @default true
                                 * @type Boolean
                                 * @writeOnce
                                 */
                                bindDOMEvents: {
                                    validator: Lang.isBoolean,
                                    value: true,
                                    writeOnce: true
                                },
                            
                                /**
                                 * Trigger node to change widget visibility state.
                                 *
                                 * @attribute trigger
                                 */
                                trigger: {
                                    setter: A.one
                                },
                            
                                /**
                                 * DOM event to hide the tooltip.
                                 *
                                 * @attribute triggerHideEvent
                                 * @type String
                                 */
                                triggerHideEvent: {
                                    value: null
                                },
                            
                                /**
                                 * DOM event to show the tooltip.
                                 *
                                 * @attribute triggerShowEvent
                                 * @type String
                                 */
                                triggerShowEvent: {
                                    value: null
                                },
                            
                                triggerShowFn: {
                                    validator: Lang.isString,
                                    value: 'show'
                                },
                            
                                triggerHideFn: {
                                    validator: Lang.isString,
                                    value: 'hide'
                                },
                            
                                triggerToggleFn: {
                                    validator: Lang.isString,
                                    value: 'toggle'
                                },
                            
                                /**
                                 * DOM event to toggle the tooltip.
                                 *
                                 * @attribute triggerToggleEvent
                                 * @type String
                                 */
                                triggerToggleEvent: {
                                    value: null
                                }
                            };
                            
                            A.mix(WidgetTrigger.prototype, {
                                _triggerEventHandles: null,
                            
                                /**
                                 * Construction logic executed during WidgetTrigger
                                 * instantiation. Lifecycle.
                                 *
                                 * @method initializer
                                 */
                                initializer: function() {
                                    var instance = this;
                            
                                    A.after(instance._afterRenderUIWT, instance, 'renderUI');
                            
                                    instance.after('triggerChange', instance._afterTriggerChange);
                                },
                            
                                /**
                                 * Destructor lifecycle implementation for the `WidgetTrigger` class.
                                 *
                                 * @method destructor
                                 * @protected
                                 */
                                destructor: function() {
                                    var instance = this;
                            
                                    (new A.EventHandle(instance._triggerEventHandles)).detach();
                                },
                            
                                /**
                                 * Fire after `renderUI`.
                                 *
                                 * @method _afterRenderUIWT
                                 * @param event
                                 * @protected
                                 */
                                _afterRenderUIWT: function() {
                                    var instance = this;
                            
                                    instance._uiSetTrigger(instance.get('trigger'));
                                },
                            
                                /**
                                 * Fire after `trigger` changes.
                                 *
                                 * @method _afterTriggerChange
                                 * @param event
                                 * @protected
                                 */
                                _afterTriggerChange: function(event) {
                                    var instance = this;
                            
                                    instance._uiSetTrigger(event.newVal);
                                },
                            
                                /**
                                 * Set the `trigger` UI.
                                 *
                                 * @method _uiSetTrigger
                                 * @param val
                                 * @protected
                                 */
                                _uiSetTrigger: function(val) {
                                    var instance = this,
                                        eventHandles,
                                        triggerHideEvent,
                                        triggerShowEvent,
                                        triggerToggleEvent,
                                        triggerHideFn,
                                        triggerShowFn,
                                        triggerToggleFn;
                            
                                    (new A.EventHandle(instance._triggerEventHandles)).detach();
                            
                                    if (val && instance.get('bindDOMEvents')) {
                                        eventHandles = instance._triggerEventHandles = [];
                            
                                        triggerHideEvent = instance.get('triggerHideEvent');
                                        triggerShowEvent = instance.get('triggerShowEvent');
                                        triggerToggleEvent = instance.get('triggerToggleEvent');
                                        triggerHideFn = instance.get('triggerHideFn');
                                        triggerShowFn = instance.get('triggerShowFn');
                                        triggerToggleFn = instance.get('triggerToggleFn');
                            
                                        if (triggerHideEvent) {
                                            eventHandles.push(
                                                val.on(instance.get('triggerHideEvent'), A.bind(instance[triggerHideFn], instance)));
                                        }
                            
                                        if (triggerShowEvent) {
                                            eventHandles.push(
                                                val.on(instance.get('triggerShowEvent'), A.bind(instance[triggerShowFn], instance)));
                                        }
                            
                                        if (triggerToggleEvent) {
                                            eventHandles.push(
                                                val.on(instance.get('triggerToggleEvent'), A.bind(instance[triggerToggleFn], instance)));
                                        }
                                    }
                                }
                            });
                            
                            A.WidgetTrigger = WidgetTrigger;