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' export interface Bindable { get_bound_method(method_name: string): (...args: any[]) => any } 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' ) } export default class AppClass { protected static make(target: Instantiable|DependencyKey, ...parameters: any[]) { return make(target, ...parameters) } protected static get app() { return make(Application) } protected make(target: Instantiable|DependencyKey, ...parameters: any[]) { return make(target, ...parameters) } protected get app() { return make(Application) } 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) } } }