click() {
		let action = get( this, "action" );
		if ( !( action instanceof Function ) ) { return; }

		let hasIconAnim = get( this, "icon" ) && get( this, "iconanim" );
		let animPromises = [];

		if ( hasIconAnim ) {
			// success and failure callbacks
			let iconAnimSuccessCalled = false;
			let iconAnimFailureCalled = false;
			animPromises.push(
				data => {
					if ( iconAnimSuccessCalled ) {
						return Promise.resolve( data );
					} else {
						iconAnimSuccessCalled = true;
						return this._iconAnimation( STATE_SUCCESS, data );
					}
				},
				data => {
					if ( iconAnimFailureCalled ) {
						return Promise.reject( data );
					} else {
						iconAnimFailureCalled = true;
						return this._iconAnimation( STATE_FAILURE, data );
					}
				}
			);

			if ( get( this, "spinner" ) ) {
				set( this, "_status", STATE_LOADING );
			}
		}

		// invoke action
		let returnPromise = action.call( this, ...animPromises );

		// is returnPromise a "thenable"?
		if ( hasIconAnim && returnPromise && returnPromise.then instanceof Function ) {
			returnPromise
				.then( ...animPromises )
				.catch( () => {} );
		}
	}
Super dirty hack!!!
hasBlock is only available as a keyword in the template
however, we need to know whether the component was invoked with a block or not
use this computed property which (lazily) sets a (different) hasBlock property here
this computed property will be called in the template's hasBlock block