code: public static function assign($obj, array $vars, array $requiredKeys = [])
      {
          foreach ($requiredKeys as $key) {
              if (! isset($vars[$key])) {
                  throw new InvalidArgumentException(sprintf('Key %s is expected to be set and not to be null', $key));
              }
          }
  
          foreach ($vars as $key => $value) {
              if (! property_exists($obj, $key)) {
                  $cls = get_class($obj);
                  Warning::warn(
                      sprintf("Trying to set non-existing property '%s' on class '%s'", $key, $cls),
                      Warning::WARNING_ASSIGN
                  );
              }
              $obj->{$key} = $value;
          }
  
          return $obj;
      }
docs: @param object   $obj
  @param mixed[]  $vars
  @param string[] $requiredKeys
  
  @return object