/**
    * 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