1<?php 2 3class Search_Formatter_Transform_DynamicLoader 4{ 5 private $source; 6 7 function __construct(Search_Formatter_DataSource_Interface $datasource) 8 { 9 $this->source = $datasource; 10 } 11 12 function __invoke($entry) 13 { 14 return new Search_Formatter_Transform_DynamicLoaderWrapper($entry, $this->source); 15 } 16} 17 18class Search_Formatter_Transform_DynamicLoaderWrapper extends ArrayObject 19{ 20 private $source; 21 private $loaded = []; 22 23 function __construct($entry, $source) 24 { 25 parent::__construct($entry); 26 $this->source = $source; 27 } 28 29 function offsetGet($name) 30 { 31 $this->load($name); 32 if (isset($this[$name])) { 33 return parent::offsetGet($name); 34 } 35 } 36 37 function offsetExists($name) 38 { 39 $this->load($name); 40 return parent::offsetExists($name); 41 } 42 43 private function load($name) 44 { 45 if (isset($this->loaded[$name])) { 46 return; 47 } 48 49 $this->loaded[$name] = true; 50 $data = $this->source->getData($this->getArrayCopy(), $name); 51 52 foreach ($data as $key => $name) { 53 $this[$key] = $name; 54 } 55 } 56} 57