You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.5 KiB
83 lines
2.5 KiB
import Instantiable from '../../../di/src/type/Instantiable.ts'
|
|
import {DependencyKey} from '../../../di/src/type/DependencyKey.ts'
|
|
import {make} from '../../../di/src/global.ts'
|
|
import Application from '../lifecycle/Application.ts'
|
|
|
|
/**
|
|
* Base type for a class that supports binding methods by string.
|
|
*/
|
|
export interface Bindable {
|
|
get_bound_method(method_name: string): (...args: any[]) => any
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given object is bindable.
|
|
* @param what
|
|
* @return boolean
|
|
*/
|
|
export function isBindable(what: any): what is Bindable {
|
|
return (
|
|
what
|
|
&& typeof what.get_bound_method === 'function'
|
|
&& what.get_bound_method.length === 1
|
|
&& typeof what.get_bound_method('get_bound_method') === 'function'
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Base class for Daton-interactive classes. Provides helpful utilities for accessing
|
|
* the underlying application and IoC container.
|
|
*/
|
|
export default class AppClass {
|
|
/**
|
|
* Use the IoC container to create an instance of the given class.
|
|
* @param {Instantiable|DependencyKey} target - the key to instantiate
|
|
* @param {...any} parameters - parameters to pass to the constructor
|
|
*/
|
|
protected static make<T>(target: Instantiable<T>|DependencyKey, ...parameters: any[]) {
|
|
return make(target, ...parameters)
|
|
}
|
|
|
|
/**
|
|
* Get the Daton app.
|
|
* @type Application
|
|
*/
|
|
protected static get app() {
|
|
return make(Application)
|
|
}
|
|
|
|
/**
|
|
* Use the IoC container to create an instance of the given class.
|
|
* @param {Instantiable|DependencyKey} target - the key to instantiate
|
|
* @param {...any} parameters - parameters to pass to the constructor
|
|
*/
|
|
protected make<T>(target: Instantiable<T>|DependencyKey, ...parameters: any[]) {
|
|
return make(target, ...parameters)
|
|
}
|
|
|
|
/**
|
|
* Get the Daton app.
|
|
* @type Application
|
|
*/
|
|
protected get app() {
|
|
return make(Application)
|
|
}
|
|
|
|
/**
|
|
* Get the method with the given name from this class, bound to this class.
|
|
* @param {string} method_name
|
|
* @return function
|
|
*/
|
|
public get_bound_method(method_name: string): (...args: any[]) => any {
|
|
// @ts-ignore
|
|
if ( typeof this[method_name] !== 'function' ) {
|
|
throw new TypeError(`Attempt to get bound method for non-function type: ${method_name}`)
|
|
}
|
|
|
|
return (...args: any[]): any => {
|
|
// @ts-ignore
|
|
return this[method_name](...args)
|
|
}
|
|
}
|
|
}
|