gnu-social/plugins/Irc/extlib/phergie/Phergie/Plugin/Iterator.php
2010-08-07 16:31:30 -07:00

143 lines
3.7 KiB
PHP

<?php
/**
* Phergie
*
* PHP version 5
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.
* It is also available through the world-wide-web at this URL:
* http://phergie.org/license
*
* @category Phergie
* @package Phergie
* @author Phergie Development Team <team@phergie.org>
* @copyright 2008-2010 Phergie Development Team (http://phergie.org)
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie
*/
/**
* Implements a filtering iterator for limiting executing of methods across
* a group of plugins.
*
* @category Phergie
* @package Phergie
* @author Phergie Development Team <team@phergie.org>
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie
*/
class Phergie_Plugin_Iterator extends FilterIterator
{
/**
* List of short names of plugins to exclude when iterating
*
* @var array
*/
protected $plugins = array();
/**
* List of method names where plugins with these methods will be
* excluded when iterating
*
* @var array
*/
protected $methods = array();
/**
* Overrides the parent constructor to reset the internal iterator's
* pointer to the current item, which the parent class errantly does not
* do.
*
* @param Iterator $iterator Iterator to filter
*
* @return void
* @link http://bugs.php.net/bug.php?id=52560
*/
public function __construct(Iterator $iterator)
{
parent::__construct($iterator);
$this->rewind();
}
/**
* Adds to a list of plugins to exclude when iterating.
*
* @param mixed $plugins String containing the short name of a single
* plugin to exclude or an array of short names of multiple
* plugins to exclude
*
* @return Phergie_Plugin_Iterator Provides a fluent interface
*/
public function addPluginFilter($plugins)
{
if (is_array($plugins)) {
$this->plugins = array_unique(
array_merge($this->plugins, $plugins)
);
} else {
$this->plugins[] = $plugins;
}
return $this;
}
/**
* Adds to a list of method names where plugins defining these methods
* will be excluded when iterating.
*
* @param mixed $methods String containing the name of a single method
* or an array containing the name of multiple methods
*
* @return Phergie_Plugin_Iterator Provides a fluent interface
*/
public function addMethodFilter($methods)
{
if (is_array($methods)) {
$this->methods = array_merge($this->methods, $methods);
} else {
$this->methods[]= $methods;
}
return $this;
}
/**
* Clears any existing plugin and methods filters.
*
* @return Phergie_Plugin_Iterator Provides a fluent interface
*/
public function clearFilters()
{
$this->plugins = array();
$this->methods = array();
}
/**
* Implements FilterIterator::accept().
*
* @return boolean TRUE to include the current item in those by returned
* during iteration, FALSE otherwise
*/
public function accept()
{
if (!$this->plugins && !$this->methods) {
return true;
}
$current = $this->current();
if (in_array($current->getName(), $this->plugins)) {
return false;
}
foreach ($this->methods as $method) {
if (method_exists($current, $method)) {
return false;
}
}
return true;
}
}