code: protected function createObject($className, $interface, $params = array())
      {
          if (is_string($className) && class_exists($className)) {
              $object = new $className();
          } elseif (is_callable($className)) {
              $object = call_user_func_array($className, $params);
          } else {
              throw new \InvalidArgumentException('$className must be a valid classname or a PHP callable');
          }
  
          if (null !== $object && !($object instanceof $interface)) {
              throw new \InvalidArgumentException(sprintf('%s must implement %s', get_class($object), $interface));
          }
  
          return $object;
      }
docs: Create an object of a specified interface
  
  @param string|callable $className Classname or a callable that returns an object instance
  @param string $interface The interface the class must implement
  @param array $params Parameters to pass to the callable
  
  @return object An object that implements the interface