/**
  * Factory method
  *
  * @param  var arg either an InputStream, File, or IOElement
  * @return self
  * @throws lang.IllegalArgumentException
  */
 public static function of($arg)
 {
     if ($arg instanceof InputStream) {
         return new self($arg);
     } else {
         if ($arg instanceof File) {
             return create(new self($arg->getInputStream()))->withMediaType(MimeType::getByFileName($arg->getFileName()))->withContentLength($arg->getSize())->withLastModified(new Date($arg->lastModified()));
         } else {
             if ($arg instanceof IOElement) {
                 return create(new self($arg->getInputStream()))->withMediaType(MimeType::getByFileName($arg->getURI()))->withContentLength($arg->getSize())->withLastModified($arg->lastModified());
             } else {
                 throw new IllegalArgumentException('Expected either an InputStream, File, or IOElement, have ' . xp::typeOf($arg));
             }
         }
     }
 }