src/Injector.php
public static function resolve() : object
    {
        $reflection = new ReflectionClass(__CLASS__);
        $constructor = $reflection->getConstructor();
        $args = [];
        $container = new Container;
        foreach ($constructor->getParameters() as $parameter) {
            $name = $parameter->name;
            $e = $inject = $class = null;
            try {
                $inject = $container->get($name);
            } catch (NotFoundExceptionInterface $e) {
            }
            if ($class = $parameter->getClass()) {
                $instance = $class->getName();
                if (isset($inject)) {
                    if ($inject instanceof $instance) {
                        $args[] = $inject;
                        continue;
                    } else {
                        throw new TypeMismatchException(get_class($inject));
                    }
                }
                if ($class->implementsInterface(
                    'Monolyth\Disclosure\Injectable'
                )) {
                    $args[] = $class::resolve();
                } else {
                    $args[] = $class->newInstance();
                }
            } elseif ($parameter->isDefaultValueAvailable()) {
                $args[] = $parameter->getDefaultValue();
            } elseif (isset($e)) {
                throw $e;
            } elseif (isset($inject)) {
                $args[] = $inject;
            }
        }
        return $reflection->newInstanceArgs($args);
    }
public static function resolve() : object
    {
        $reflection = new ReflectionClass(__CLASS__);
        $constructor = $reflection->getConstructor();
        $args = [];
        $container = new Container;
        foreach ($constructor->getParameters() as $parameter) {
            $name = $parameter->name;
            $e = $inject = $class = null;
            try {
                $inject = $container->get($name);
            } catch (NotFoundExceptionInterface $e) {
            }
            if ($class = $parameter->getClass()) {
                $instance = $class->getName();
                if (isset($inject)) {
                    if ($inject instanceof $instance) {
                        $args[] = $inject;
                        continue;
                    } else {
                        throw new TypeMismatchException(get_class($inject));
                    }
                }
                if ($class->implementsInterface(
                    'Monolyth\Disclosure\Injectable'
                )) {
                    $args[] = $class::resolve();
                } else {
                    $args[] = $class->newInstance();
                }
            } elseif ($parameter->isDefaultValueAvailable()) {
                $args[] = $parameter->getDefaultValue();
            } elseif (isset($e)) {
                throw $e;
            } elseif (isset($inject)) {
                $args[] = $inject;
            }
        }
        return $reflection->newInstanceArgs($args);
    }
public static function resolve ( ) : object { $ reflection = new ReflectionClass ( __CLASS__ ) ; $ constructor = $ reflection -> getConstructor ( ) ; $ args = [ ] ; $ container = new Container ; foreach ( $ constructor -> getParameters ( ) as $ parameter ) { $ name = $ parameter -> name ; $ e = $ inject = $ class = null ; try { $ inject = $ container -> get ( $ name ) ; } catch ( NotFoundExceptionInterface $ e ) { } if ( $ class = $ parameter -> getClass ( ) ) { $ instance = $ class -> getName ( ) ; if ( isset ( $ inject ) ) { if ( $ inject instanceof $ instance ) { $ args [ ] = $ inject ; continue ; } else { throw new TypeMismatchException ( get_class ( $ inject ) ) ; } } if ( $ class -> implementsInterface ( 'Monolyth\Disclosure\Injectable' ) ) { $ args [ ] = $ class :: resolve ( ) ; } else { $ args [ ] = $ class -> newInstance ( ) ; } } elseif ( $ parameter -> isDefaultValueAvailable ( ) ) { $ args [ ] = $ parameter -> getDefaultValue ( ) ; } elseif ( isset ( $ e ) ) { throw $ e ; } elseif ( isset ( $ inject ) ) { $ args [ ] = $ inject ; } } return $ reflection -> newInstanceArgs ( $ args ) ; }
For classes that expect dependencies in their constructor, you can use
this method instead of "new" with lots of Container::get calls.

Type-hinted arguments _must_ match a dependency. If no dependency exists,
a new instance will be passed.

@return object An object of the same class as called on, with dependencies
injected through its constructor.
@throws Disclosure\TypeMismatchException if the retrieved dependency does
not satisfy the argument's type hint.
@throws Psr\Container\Exception\NotFoundExceptionInterface if _any_ of
the requested dependencies could not be resolved.
For classes that expect dependencies in their constructor you can use this method instead of new with lots of Container :: get calls .