public function bind($abstract, $concrete = null, $shared = false)
    {
        if ($concrete == null) {
            $concrete = $abstract;
        }

        if ( ! ($concrete instanceof Closure)) {
            $concrete = function ($container, $args = []) use ($abstract, $concrete) {
                $method = ($abstract == $concrete || is_object($concrete)) ? 'build' : 'make';
                return $container->$method($concrete, $args);
            };
        }

        $this->bindings[$abstract] = [
            'concrete' => $concrete,
            'shared' => $shared
        ];
    }