You are here

class FnStream in Lockr 7.3

Compose stream implementations based on a hash of functions.

Allows for easy testing and extension of a provided stream without needing to create a concrete class for a simple extension point.

Hierarchy

Expanded class hierarchy of FnStream

File

vendor/guzzlehttp/psr7/src/FnStream.php, line 12

Namespace

GuzzleHttp\Psr7
View source
class FnStream implements StreamInterface {

  /** @var array */
  private $methods;

  /** @var array Methods that must be implemented in the given array */
  private static $slots = [
    '__toString',
    'close',
    'detach',
    'rewind',
    'getSize',
    'tell',
    'eof',
    'isSeekable',
    'seek',
    'isWritable',
    'write',
    'isReadable',
    'read',
    'getContents',
    'getMetadata',
  ];

  /**
   * @param array $methods Hash of method name to a callable.
   */
  public function __construct(array $methods) {
    $this->methods = $methods;

    // Create the functions on the class
    foreach ($methods as $name => $fn) {
      $this->{'_fn_' . $name} = $fn;
    }
  }

  /**
   * Lazily determine which methods are not implemented.
   * @throws \BadMethodCallException
   */
  public function __get($name) {
    throw new \BadMethodCallException(str_replace('_fn_', '', $name) . '() is not implemented in the FnStream');
  }

  /**
   * The close method is called on the underlying stream only if possible.
   */
  public function __destruct() {
    if (isset($this->_fn_close)) {
      call_user_func($this->_fn_close);
    }
  }

  /**
   * An unserialize would allow the __destruct to run when the unserialized value goes out of scope.
   * @throws \LogicException
   */
  public function __wakeup() {
    throw new \LogicException('FnStream should never be unserialized');
  }

  /**
   * Adds custom functionality to an underlying stream by intercepting
   * specific method calls.
   *
   * @param StreamInterface $stream  Stream to decorate
   * @param array           $methods Hash of method name to a closure
   *
   * @return FnStream
   */
  public static function decorate(StreamInterface $stream, array $methods) {

    // If any of the required methods were not provided, then simply
    // proxy to the decorated stream.
    foreach (array_diff(self::$slots, array_keys($methods)) as $diff) {
      $methods[$diff] = [
        $stream,
        $diff,
      ];
    }
    return new self($methods);
  }
  public function __toString() {
    return call_user_func($this->_fn___toString);
  }
  public function close() {
    return call_user_func($this->_fn_close);
  }
  public function detach() {
    return call_user_func($this->_fn_detach);
  }
  public function getSize() {
    return call_user_func($this->_fn_getSize);
  }
  public function tell() {
    return call_user_func($this->_fn_tell);
  }
  public function eof() {
    return call_user_func($this->_fn_eof);
  }
  public function isSeekable() {
    return call_user_func($this->_fn_isSeekable);
  }
  public function rewind() {
    call_user_func($this->_fn_rewind);
  }
  public function seek($offset, $whence = SEEK_SET) {
    call_user_func($this->_fn_seek, $offset, $whence);
  }
  public function isWritable() {
    return call_user_func($this->_fn_isWritable);
  }
  public function write($string) {
    return call_user_func($this->_fn_write, $string);
  }
  public function isReadable() {
    return call_user_func($this->_fn_isReadable);
  }
  public function read($length) {
    return call_user_func($this->_fn_read, $length);
  }
  public function getContents() {
    return call_user_func($this->_fn_getContents);
  }
  public function getMetadata($key = null) {
    return call_user_func($this->_fn_getMetadata, $key);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FnStream::$methods private property @var array
FnStream::$slots private static property @var array Methods that must be implemented in the given array
FnStream::close public function Closes the stream and any underlying resources. Overrides StreamInterface::close
FnStream::decorate public static function Adds custom functionality to an underlying stream by intercepting specific method calls.
FnStream::detach public function Separates any underlying resources from the stream. Overrides StreamInterface::detach
FnStream::eof public function Returns true if the stream is at the end of the stream. Overrides StreamInterface::eof
FnStream::getContents public function Returns the remaining contents in a string Overrides StreamInterface::getContents
FnStream::getMetadata public function Get stream metadata as an associative array or retrieve a specific key. Overrides StreamInterface::getMetadata
FnStream::getSize public function Get the size of the stream if known. Overrides StreamInterface::getSize
FnStream::isReadable public function Returns whether or not the stream is readable. Overrides StreamInterface::isReadable
FnStream::isSeekable public function Returns whether or not the stream is seekable. Overrides StreamInterface::isSeekable
FnStream::isWritable public function Returns whether or not the stream is writable. Overrides StreamInterface::isWritable
FnStream::read public function Read data from the stream. Overrides StreamInterface::read
FnStream::rewind public function Seek to the beginning of the stream. Overrides StreamInterface::rewind
FnStream::seek public function Seek to a position in the stream. Overrides StreamInterface::seek
FnStream::tell public function Returns the current position of the file read/write pointer Overrides StreamInterface::tell
FnStream::write public function Write data to the stream. Overrides StreamInterface::write
FnStream::__construct public function
FnStream::__destruct public function The close method is called on the underlying stream only if possible.
FnStream::__get public function Lazily determine which methods are not implemented.
FnStream::__toString public function Reads all data from the stream into a string, from the beginning to end. Overrides StreamInterface::__toString
FnStream::__wakeup public function An unserialize would allow the __destruct to run when the unserialized value goes out of scope.