public function build($concrete, $args = [])
    {
        if ($concrete instanceof Closure) {
            return $concrete($this, $args);
        }

        $reflectionClass = new ReflectionClass($concrete);

        if ( ! $reflectionClass->isInstantiable()) {
            throw new Exception(sprintf('`s` type is not instantiable !', $concrete));
        }

        $constructor = $reflectionClass->getConstructor();

        if ($constructor === null) {
            return new $concrete();
        }

        $dependencies = $this->getMethodDependencies($constructor, $args);

        return $reflectionClass->newInstanceArgs($dependencies);
    }