public function __construct($key)
 {
     parent::__construct("Implementer for the key '{$key}' is not defined", 2);
 }
 public function __construct($key)
 {
     parent::__construct("Implementer for the key '{$key}' is already defined", 1);
 }
 public function __construct($implementer)
 {
     $type = gettype($implementer);
     parent::__construct("Invalid value. Value must be of type string or object, got {$type} instead", 4);
 }
 public function __construct($type)
 {
     parent::__construct("Invalid type '{$type}'", 5);
 }
 public function __construct($key)
 {
     $type = gettype($key);
     parent::__construct("Invalid key. Expecting string, got {$type} instead", 3);
 }