import { Client } from '../client/Client';

/**
 * Method to be implemented that will be executed whenever the event this handler
 * is for is emitted by the Client
 * @abstact
 * @method Event#action
 * @param {any[]} args - The args your event handler will be receiving
 * 						 from the event it handles
 * @returns {void}
 */

/**
 * Event class to extend when writing your own custom event handlers
 * @abstract
 * @param {string} name - Name of the Client event this event handler
 * 						  will handle
 */
export abstract class Event<T extends Client = Client>
{
	public name: string;
	public client!: T;

	public constructor(name: string)
	{
		this.name = name;
	}

	/**
	 * Receive the client instance and save it
	 * @private
	 */
	public _register(client: T): void
	{
		this.client = client;
	}

	// Docs above class
	public abstract action(...args: any[]): void;
}

import { Client } from '../client/Client';

/**
 * Method to be implemented that will be executed whenever the event this handler
 * is for is emitted by the Client
 * @abstact
 * @method Event#action
 * @param {any[]} ...args - The args your event handler will be receiving
 * 						 from the event it handles
 * @returns {void}
 */

/**
 * Event class to extend when writing your own custom event handlers
 * @abstract
 * @param {string} name - Name of the Client event this event handler
 * 						  will handle
 */
export abstract class Event<T extends Client = Client>
{
	public name: string;
	public client!: T;

	public constructor(name: string)
	{
		this.name = name;
	}

	/**
	 * Receive the client instance and save it
	 * @private
	 */
	public _register(client: T): void
	{
		this.client = client;
	}

	// Docs above class
	public abstract action(...args: any[]): void;
}

Test how jsdoc will render rest args
Test how jsdoc will render rest args

Because I just realized I'm not aware of anywhere I'm using them in the docs