public function bind($abstract, $concrete = null, array $args = [])
    {
        /**
         * @todo validate that $abstract is a string
         * @todo validate that $concrete is a string or null
         */

        if (is_null($concrete)) {
            $concrete = $abstract;
        }

        if (isset($this->definitions[$abstract])) {

            $definition = $this->definitions[$abstract];

            $definition->setClass($concrete);

            $definition->withArgs($args);

        } else {

            $definition = new Definition($this, $concrete, $args);

            $this->definitions[$abstract] = $definition;
        }

        return $definition;
    }