public function __call($name, $arguments)
 {
     if (method_exists($this->threadClass, $name)) {
         $threadToCall = array_pop($this->threadsLazy);
         if ($threadToCall === null) {
             if ($this->getNumberOfThreads() >= $this->maximumNumberOfThreads) {
                 throw new \RuntimeException("Maximum number of threads reached. Increase the maximum or limit your calls");
             } else {
                 $threadToCall = $this->createThreadRunning();
             }
         }
         $result = call_user_func_array(array($threadToCall, $name), $arguments);
         //is async?
         if ($result instanceof AsyncMessage && false === $result->isIsResolved()) {
             $originalCallback = $result->getResolvedCallback();
             //wrap message callback to handle multiple messages at once
             $newCallback = function (AsyncMessage $message) use($originalCallback, $threadToCall) {
                 if ($message->isIsResolved()) {
                     unset($this->threadsWorking[spl_object_hash($threadToCall)]);
                     $this->threadsLazy[spl_object_hash($threadToCall)] = $threadToCall;
                     $this->CheckThreadLimits();
                     if (count($this->threadsWorking) <= 0 && $this->lazyThreadTimeoutSec > 0) {
                         $this->loop->addTimer($this->lazyThreadTimeoutSec, function () {
                             $this->CheckThreadLimits();
                         });
                     }
                 }
                 if (is_callable($originalCallback)) {
                     $originalCallback($message);
                 }
             };
             $result->setResolvedCallback($newCallback);
             $this->threadsWorking[spl_object_hash($threadToCall)] = $threadToCall;
             $this->CheckThreadLimits();
         } else {
             $this->threadsLazy[spl_object_hash($threadToCall)] = $threadToCall;
         }
     } else {
         throw new InvalidArgumentException("Method {$this->threadClass}::{$name} does not exists or is not accessable");
     }
 }