| 
<?php
 class ExampleA
 {
 public $variable;
 }
 
 class ExampleB
 {
 public $exampleA;
 
 public $uniqueId;
 
 public function __construct(ExampleA $exampleA)
 {
 $this->exampleA = $exampleA;
 
 $this->exampleA->variable = uniqid();
 }
 }
 
 class ExampleC
 {
 public function methodWithDependencies(ExampleA $a, ExampleB $b, $customInteger, $customString)
 {
 var_dump($a->variable, $b->uniqueId, $customInteger, $customString);
 }
 }
 
 // Creates new instance of ExampleB and returns it
 $exampleBOne = AutoDi::getInstance(ExampleB::class);
 
 // Gets already created instance of ExampleB (Singleton)
 $exampleBTwo = AutoDi::getInstance(ExampleB::class);
 
 // Creates new instance of ExampleB without affecting previous
 $exampleBThree = AutoDi::getNewInstance(ExampleB::class);
 
 // Set value in $exampleBOne
 $exampleBOne->uniqueId = 'this value SHOULD NOT be printed out!!!';
 
 // Set value in $exampleBThree
 $exampleBThree->uniqueId = 'this value is for itself';
 
 // Set value in $exampleBTwo
 $exampleBTwo->uniqueId = 'this value SHOULD be printed out!!!';
 
 // Executes method "methodWithDependencies" from object (ExampleC)
 // last argument are parameters of method that are scalar type or non typed
 // e.g:
 //
 //  methodWithDependencies(ExampleA $a, ExampleB $b, $customInteger, $customString)
 //    AutoDi will inject first and second parameter (ExampleA and ExampleB) and use
 //    values from array that is last argument of AutoDi::autoInvoke
 //
 // if method looked something like this
 //    methodWithDependencies(ExampleA $a, $customInteger, ExampleB $b, $customString)
 //     AutoDi will map non typed parameters with array elements, so $customInteger and $customString
 //    will be same as in previous example because of order
 AutoDi::autoInvoke(AutoDi::getInstance(ExampleC::class), 'methodWithDependencies', [1, 'string']);
 |