Version 1
[yaffs-website] / vendor / php-instagram-api / php-instagram-api / Instagram / Collection / CollectionAbstract.php
diff --git a/vendor/php-instagram-api/php-instagram-api/Instagram/Collection/CollectionAbstract.php b/vendor/php-instagram-api/php-instagram-api/Instagram/Collection/CollectionAbstract.php
new file mode 100644 (file)
index 0000000..ae6d983
--- /dev/null
@@ -0,0 +1,208 @@
+<?php
+
+/**
+* Instagram PHP
+* @author Galen Grover <galenjr@gmail.com>
+* @license http://opensource.org/licenses/mit-license.php The MIT License
+*/
+
+namespace Instagram\Collection;
+
+/**
+ * Abstract Collection
+ *
+ * All Collections extend this class
+ */
+abstract class CollectionAbstract implements \IteratorAggregate, \ArrayAccess, \Countable {
+
+    /**
+     * Holds the pagination data for the collection
+     *
+     * @var StdClass
+     * @access protected
+     */
+    protected $pagination;
+
+    /**
+     * Holds the data for the collection
+     *
+     * @var array
+     * @access protected
+     */
+    protected $data = array();
+
+    /**
+     * Holds the position for the iterator
+     *
+     * @var integer
+     * @access protected
+     */
+    protected $position;
+
+    /**
+     * Constructor
+     *
+     * Sets the data and child object's proxies
+     *
+     * @param StdClass $data Data from the API
+     * @param \Instagram\Core\Proxy $proxy Proxy to pass on to teh collection's objects
+     * @access public
+     */
+    public function __construct( $raw_data = null, \Instagram\Core\Proxy $proxy = null ) {
+        if ( $raw_data ) {
+            $this->setData( $raw_data );
+        }
+        if ( $proxy ) {
+            $this->setProxies( $proxy );
+        }
+    }
+
+    /**
+     * Set the collections data
+     *
+     * @param StdClass $data Data from the API
+     * @access public
+     */
+    public abstract function setData( $raw_data );
+
+    /**
+     * Get the collection's data
+     *
+     * @return StdClass
+     * @access public
+     */
+    public function getData() {
+        return $this->data;
+    }
+
+    /**
+     * Get a collection item
+     *
+     * @param int $position Item to retrieve, starting at 0
+     * @return mixed Returns the collection item at the position
+     * @access public
+     */
+    public function getItem( $position ) {
+        return isset( $this->data[$position] ) ? $this->data[$position] : null;
+    }
+
+    /**
+     * Get a slice of the collection
+     *
+     * @param int $offset Where to start the slice
+     * @param int $length Length of the slice
+     * @return array Returns a slice of the array
+     * @access public
+     */
+    public function getSlice( $offset, $length ) {
+        return array_slice( $this->data, $offset, $length );
+    }
+
+    /**
+     * Add data
+     *
+     * Add data from another collection the this collection
+     *
+     * @param \Instagram\Collection\CollectionAbstract $object Object to add the data of
+     * @access public
+     */
+    public function addData( \Instagram\Collection\CollectionAbstract $object ) {
+        $this->data = array_merge( $this->data, $object->getData() );
+    }
+
+    /**
+     * Convert the collection's objects
+     *
+     * Child classes use this to turn the objects into the correct class
+     *
+     * @param string $object
+     * @access protected
+     */
+    protected function convertData( $object ) {
+        $this->data = array_map(
+            function( $c ) use( $object ) {
+                return new $object( $c );
+            },
+            $this->data
+        );
+    }
+
+    /**
+     * Set object proxies
+     *
+     * Sets all the child object's proxies
+     *
+     * @param \Instagram\Core\Proxy $proxy
+     * @access public
+     */
+    public function setProxies( \Instagram\Core\Proxy $proxy ) {
+        foreach( $this->data as $object ) {
+            $object->setProxy( $proxy );
+        }
+    }
+
+    /**
+     * Implode the collection
+     *
+     * Implode the collection into a string
+     *
+     * Example - Get a media's tags into a comma delimited string
+     *
+     * $media->getTags()->implode(
+     *     function( $t ){ return sprintf( '<a href="?example=tag.php&tag=%1$s">#%1$s</a>', $t ); }
+     * )
+     *
+     * @param Closure $callback Function to run on the collection 
+     * @param string $sep Implode separator
+     * @access public
+     */
+    public function implode( \Closure $callback = null, $sep = ', ' ) {
+        if ( !count( $this->getData() ) ) {
+            return null;
+        }
+        if ( !$callback ) {
+            $callback = function( $i ){ return $i->__toString(); };
+        }
+        foreach( $this->getData() as $item ) {
+            $items[] = $callback( $item );
+        }
+        return implode( $sep, $items );
+    }
+
+    /**
+     * IteratorAggregate
+     *
+     * {@link http://us2.php.net/manual/en/class.iteratoraggregate.php}
+     */
+    public function getIterator(){
+        return new \ArrayIterator( $this->data );
+    }
+
+    /**
+     * ArrayAccess
+     *
+     * {@link http://us2.php.net/manual/en/class.arrayaccess.php}
+     */
+    public function offsetExists( $offset ) {
+        return isset( $this->data[$offset] );
+    }
+    public function offsetGet( $offset ) {
+        return $this->data[$offset];
+    }
+    public function offsetSet( $offset, $value ) {
+        trigger_error( "You can't set collection data");
+    }
+    public function offsetUnset( $offset ) {
+        trigger_error( "You can't unset collection data" );
+    }
+
+    /**
+     * Countable
+     * 
+     * {@link http://us2.php.net/manual/en/class.countable.php}
+     */
+    public function count() {
+        return count( $this->data );
+    }
+
+}
\ No newline at end of file