/**    * Register a new resolving callback by type of its first argument.    *    * @param  \Closure  $callback    * @return void    */// Register a new resolving callback by type of its first argument   protected function resolvingCallback(Closure $callback)   {       $abstract = $this->getFunctionHint($callback);// get the abstract function       if ($abstract) {// if get the abstract function set in           $this->resolvingCallbacks[$abstract][] = $callback;// one is abstract function       } else {           $this->globalResolvingCallbacks[] = $callback;// other set in the global Resolving Call backs       }   }   /**    * Register a new after resolving callback by type of its first argument.    *    * @param  \Closure  $callback    * @return void    */   protected function afterResolvingCallback(Closure $callback)   {       $abstract = $this->getFunctionHint($callback);// get the result       if ($abstract) {           $this->afterResolvingCallbacks[$abstract][] = $callback;// one is in the abstract       } else {           $this->globalAfterResolvingCallbacks[] = $callback;       }   }   /**    * Get the type hint for this closure's first argument.    *    * @param  \Closure  $callback    * @return mixed    */// hint is type  or a way   protected function getFunctionHint(Closure $callback)   {       $function = new ReflectionFunction($callback);// get the new Reflection Function       if ($function->getNumberOfParameters() == 0) {           return;       }// if $function       $expected = $function->getParameters()[0];       if (! $expected->getClass()) {// getClass           return;       }       return $expected->getClass()->name;// get the class name.   }// sorry ,this too easy