X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmerry%2FContainer.php;fp=lib%2Fmerry%2FContainer.php;h=7f4d8fc7b2e1ce459510cca904de861ceff1bade;hb=c5cc1f0cf7b1b7665e7e9d5745855066527605e6;hp=0000000000000000000000000000000000000000;hpb=efc2af3c944d9c1180f1b503a664695ef10cf6f2;p=m6w6%2Fmerry diff --git a/lib/merry/Container.php b/lib/merry/Container.php new file mode 100644 index 0000000..7f4d8fc --- /dev/null +++ b/lib/merry/Container.php @@ -0,0 +1,229 @@ +props = new \stdClass; + $this->auto = $auto; + + foreach ((array) $array as $property => $value) { + $this->__set($property, $value); + } + } + + /** + * Recursively turn a container and its childs into an array + * @param \merry\Container $o the Container instance to convert to an array + * @return array + */ + protected function arrayify(Container $o) { + $a = []; + + foreach ($o->props as $k => $v) { + if ($v instanceof Container) { + $a[$k] = $this->arrayify($v); + } else { + $a[$k] = $v; + } + } + + return $a; + } + + /** + * Apply one or mor modifier callbacks + * @param mixed $modifier + * @return \merry\Config + */ + public function apply($modifier) { + if (is_callable($modifier)) { + foreach ($this->props as $prop => $value) { + $this->__set($prop, $modifier($value, $prop)); + } + } else { + foreach ($modifier as $key => $mod) { + if (is_callable($mod)) { + $this->props->$key = $mod(isset($this->props->$key) ? $this->props->$key : null, $key); + } elseif (is_array($mod)) { + $this->props->$key->apply($mod); + } else { + /* */ + } + } + } + return $this; + } + + /** + * Return the complete config as array + * @return array + */ + function toArray() { + return $this->arrayify($this); + } + + /** + * @ignore + */ + function &__get($prop) { + if ($this->auto && !isset($this->props->$prop)) { + $this->props->$prop = new static; + } + return $this->props->$prop; + } + + /** + * @ignore + */ + function __set($prop, $value) { + if (isset($value) && !is_scalar($value) && !($value instanceof Config)) { + $value = new static((array) $value); + } + if (!strlen($prop)) { + $prop = $this->index++; + } elseif (is_numeric($prop) && !strcmp($prop, (int) $prop)) { + /* update internal index */ + if ($prop >= $this->index) { + $this->index = $prop + 1; + } + } + + $this->props->$prop = $value; + } + + /** + * @ignore + */ + function __isset($prop) { + return isset($this->props->$prop); + } + + /** + * @ignore + */ + function __unset($prop) { + unset($this->props->$prop); + } + + /** + * @ignore + */ + function offsetGet($o) { + return $this->props->$o; + } + + /** + * @ignore + */ + function offsetSet($o, $v) { + $this->__set($o, $v); + } + + /** + * @ignore + */ + function offsetExists($o) { + return isset($this->props->$o); + } + + /** + * @ignore + */ + function offsetUnset($o) { + unset($this->props->$o); + } + + /** + * @ignore + */ + function rewind() { + $this->riter = (array) $this->props; + reset($this->riter); + } + + /** + * @ignore + */ + function valid() { + return NULL !== key($this->riter); + } + + /** + * @ignore + */ + function next() { + next($this->riter); + } + + /** + * @ignore + */ + function key() { + return key($this->riter); + } + + /** + * @ignore + */ + function current() { + return current($this->riter); + } + + /** + * @ignore + */ + function hasChildren() { + return current($this->riter) instanceof Container; + } + + /** + * @ignore + */ + function getChildren() { + return current($this->riter); + } + + /** + * @ignore + */ + function jsonSerialize() { + return $this->arrayify($this); + } +} + +/* vim: set noet ts=4 sw=4: */