Skip to content
Snippets Groups Projects
FriendlyBuilderBag.php 2.21 KiB
Newer Older
<?php

/*
 * This file is part of the ONGR package.
 *
 * (c) NFQ Technologies UAB <info@nfq.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ONGR\ElasticsearchBundle\DSL;

/**
 * Container for friendly builders.
 */
class FriendlyBuilderBag
{
    /**
     * @var FriendlyBuilderInterface[]
     */
    private $bag = [];

    /**
     * @param FriendlyBuilderInterface[] $builders
     */
    public function __construct(array $builders = [])
    {
        $this->set($builders);
    }

    /**
     * Replaces builders with new ones.
     *
     * @param FriendlyBuilderInterface[] $builders
     */
    public function set(array $builders)
    {
        foreach ($builders as $builder) {
            $this->add($builder);
        }
    }

    /**
     * Adds a builder.
     *
     * @param FriendlyBuilderInterface $builder
     */
    public function add(FriendlyBuilderInterface $builder)
    {
        $this->bag[$builder->getName()] = $builder;
    }

    /**
     * Checks if builder is set by name.
     *
     * @param string $name Builder name.
     *
     * @return bool
     */
    public function has($name)
    {
        return isset($this->bag[$name]);
    }

    /**
     * Removes a builder by name.
     *
     * @param string $name Builder name.
     */
    public function remove($name)
    {
        unset($this->bag[$name]);
    }

    /**
     * Clears contained builders.
     */
    public function clear()
    {
        $this->bag = [];
    }

    /**
     * Returns a builder by name.
     *
     * @param string $name Builder name.
     *
     * @return FriendlyBuilderInterface
     */
    public function get($name)
    {
        return $this->bag[$name];
    }

    /**
     * Returns all builders contained.
     *
     * @param string|null $name Builder name.
     *
     * @return FriendlyBuilderInterface[]
     */
    public function all($name = null)
    {
        return array_filter(
            $this->bag,
            function ($builder) use ($name) {
                /** @var FriendlyBuilderInterface $builder */

                return $name === null || $builder->getName() == $name;
            }
        );
    }
}