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