definition = $definition; $this->shapeMap = $shapeMap; } public function toArray() { return $this->definition; } public function offsetGet($offset) { return isset($this->definition[$offset]) ? $this->definition[$offset] : null; } public function offsetSet($offset, $value) { $this->definition[$offset] = $value; } public function offsetExists($offset) { return isset($this->definition[$offset]); } public function offsetUnset($offset) { unset($this->definition[$offset]); } protected function shapeAt($key) { if (!isset($this->definition[$key])) { throw new \InvalidArgumentException('Expected shape definition at ' . $key); } return $this->shapeFor($this->definition[$key]); } protected function shapeFor(array $definition) { return isset($definition['shape']) ? $this->shapeMap->resolve($definition) : Shape::create($definition, $this->shapeMap); } }