--- /dev/null
+<?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