<?php
class Foo {
	public $name;
	public $type;
	
	public function __construct($name, $type) {
		$this->name = $name;
		$this->type = $type;
	}
	
	public static function searchZeroType($o) {
		return ($o->type == 0);
	}
	
	public static function doubleType($o) {
		$r = $o->type;
		$r= $r * 2;
		
		return $r;
	}
}

class SplObjectStorageExtended extends SplObjectStorage {
	
	public function objectFilter(callable $c) {
		$s = new SplObjectStorageExtended();
		
		foreach($this as $object) {
			if ($c($object)) {
				$s->attach($object);
			}
		}
		
		return $s;
	}
	
	public function objectMap(callable $c) {
		$array = array();
		
		foreach($this as $object) {
			$array[] = $c($object);
		}
		
		return $array;
	}
	
	public function objectWalk(callable $c) {
		foreach ($this as $object) {
			$c($object);
		}
	}
}

$a = new SplObjectStorageExtended();

$a->attach(new Foo('first', 1));
$a->attach(new Foo('second', 1));
$a->attach(new Foo('third', 0));
$a->attach(new Foo('fourth', 1));


$search = $a->objectFilter(array('Foo', 'searchZeroType'));
$double = $a->objectMap(array('Foo', 'doubleType'), $a);

$a->objectWalk(function($o) {echo $o->name . " ";});

//print_r($search);