| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | <?phpnamespace Aws\Api;/** * Builds shape based on shape references. */class ShapeMap{    /** @var array */    private $definitions;    /** @var Shape[] */    private $simple;    /**     * @param array $shapeModels Associative array of shape definitions.     */    public function __construct(array $shapeModels)    {        $this->definitions = $shapeModels;    }    /**     * Get an array of shape names.     *     * @return array     */    public function getShapeNames()    {        return array_keys($this->definitions);    }    /**     * Resolve a shape reference     *     * @param array $shapeRef Shape reference shape     *     * @return Shape     * @throws \InvalidArgumentException     */    public function resolve(array $shapeRef)    {        $shape = $shapeRef['shape'];        if (!isset($this->definitions[$shape])) {            throw new \InvalidArgumentException('Shape not found: ' . $shape);        }        $isSimple = count($shapeRef) == 1;        if ($isSimple && isset($this->simple[$shape])) {            return $this->simple[$shape];        }        $definition = $shapeRef + $this->definitions[$shape];        $definition['name'] = $definition['shape'];        if (isset($definition['shape'])) {            unset($definition['shape']);        }        $result = Shape::create($definition, $this);        if ($isSimple) {            $this->simple[$shape] = $result;        }        return $result;    }}
 |