protected function call_closure( $closure, array $parameters = [] ) {
		if ( $closure instanceof Closure ) {
			$rc      = new ReflectionFunction( $closure );
			$args    = $rc->getParameters();
			$params  = $parameters;
			$classes = [
				$this->get_class_prefix( get_class( $this ) ),
				get_class( $this ),
				get_parent_class( $this )
			];

			foreach ( $args as $index => $arg ) {
				if ( $arg->getClass() === null ) {
					continue;
				}

				if ( in_array( $arg->getClass()->name, $classes, true ) ) {
					$parameters[$index] = $this;
				} else if ( $this->exists( $arg->getClass()->name ) ) {
					$parameters[$index] = $this->make( $arg->getClass()->name );
				}
			}

			if ( ! empty( $args ) && empty( $parameters ) ) {
				$parameters[0] = $this;
			}

			if ( count( $args ) > count( $parameters ) ) {
				$parameters = array_merge( $parameters, $params );
			}

			return $this->call_closure( call_user_func_array( $closure, $parameters ), $parameters );
		}

		return $closure;
	}
protected function call_closure( $closure, array $parameters = [] ) {
		if ( $closure instanceof Closure ) {
			$rc      = new ReflectionFunction( $closure );
			$args    = $rc->getParameters();
			$params  = $parameters;
			$classes = [
				$this->get_class_prefix( get_class( $this ) ),
				get_class( $this ),
				get_parent_class( $this )
			];

			foreach ( $args as $index => $arg ) {
				if ( $arg->getClass() === null ) {
					continue;
				}

				if ( in_array( $arg->getClass()->name, $classes, true ) ) {
					$parameters[$index] = $this;
				} else if ( $this->exists( $arg->getClass()->name ) ) {
					$parameters[$index] = $this->make( $arg->getClass()->name );
				}
			}

			if ( ! empty( $args ) && empty( $parameters ) ) {
				$parameters[0] = $this;
			}

			if ( count( $args ) > count( $parameters ) ) {
				$parameters = array_merge( $parameters, $params );
			}

			return $this->call_closure( call_user_func_array( $closure, $parameters ), $parameters );
		}

		return $closure;
	}
protected function call_closure ( $ closure , array $ parameters = [ ] ) { if ( $ closure instanceof Closure ) { $ rc = new ReflectionFunction ( $ closure ) ; $ args = $ rc -> getParameters ( ) ; $ params = $ parameters ; $ classes = [ $ this -> get_class_prefix ( get_class ( $ this ) ) , get_class ( $ this ) , get_parent_class ( $ this ) ] ; foreach ( $ args as $ index => $ arg ) { if ( $ arg -> getClass ( ) === null ) { continue ; } if ( in_array ( $ arg -> getClass ( ) -> name , $ classes , true ) ) { $ parameters [ $ index ] = $ this ; } else if ( $ this -> exists ( $ arg -> getClass ( ) -> name ) ) { $ parameters [ $ index ] = $ this -> make ( $ arg -> getClass ( ) -> name ) ; } } if ( ! empty ( $ args ) && empty ( $ parameters ) ) { $ parameters [ 0 ] = $ this ; } if ( count ( $ args ) > count ( $ parameters ) ) { $ parameters = array_merge ( $ parameters , $ params ) ; } return $ this -> call_closure ( call_user_func_array ( $ closure , $ parameters ) , $ parameters ) ; } return $ closure ; }
Call closure.

@param mixed $closure
@param array $parameters

@return Closure
Call closure .