master

laravel/framework

Last updated at: 29/12/2023 09:20

HigherOrderWhenProxy.php

TLDR

The HigherOrderWhenProxy class is a proxy class that allows conditionally performing operations on a target. It can proxy attribute access and method calls to the target. The proxy can be given a condition and the operations will be performed based on the condition.

Classes

Class: HigherOrderWhenProxy

The HigherOrderWhenProxy class is a proxy class that allows conditionally performing operations on a target.

It has the following properties:

  • $target (mixed): The target being conditionally operated on.
  • $condition (bool): The condition for proxying.
  • $hasCondition (bool): Indicates whether the proxy has a condition.
  • $negateConditionOnCapture (bool): Determine whether the condition should be negated.

It has the following methods:

  • __construct($target): Create a new proxy instance.
  • condition($condition): Set the condition on the proxy.
  • negateConditionOnCapture(): Indicate that the condition should be negated.
  • __get($key): Proxy accessing an attribute onto the target.
  • __call($method, $parameters): Proxy a method call on the target.
<?php

namespace Illuminate\Support;

class HigherOrderWhenProxy
{
    /**
     * The target being conditionally operated on.
     *
     * @var mixed
     */
    protected $target;

    /**
     * The condition for proxying.
     *
     * @var bool
     */
    protected $condition;

    /**
     * Indicates whether the proxy has a condition.
     *
     * @var bool
     */
    protected $hasCondition = false;

    /**
     * Determine whether the condition should be negated.
     *
     * @var bool
     */
    protected $negateConditionOnCapture;

    /**
     * Create a new proxy instance.
     *
     * @param  mixed  $target
     * @return void
     */
    public function __construct($target)
    {
        $this->target = $target;
    }

    /**
     * Set the condition on the proxy.
     *
     * @param  bool  $condition
     * @return $this
     */
    public function condition($condition)
    {
        [$this->condition, $this->hasCondition] = [$condition, true];

        return $this;
    }

    /**
     * Indicate that the condition should be negated.
     *
     * @return $this
     */
    public function negateConditionOnCapture()
    {
        $this->negateConditionOnCapture = true;

        return $this;
    }

    /**
     * Proxy accessing an attribute onto the target.
     *
     * @param  string  $key
     * @return mixed
     */
    public function __get($key)
    {
        if (! $this->hasCondition) {
            $condition = $this->target->{$key};

            return $this->condition($this->negateConditionOnCapture ? ! $condition : $condition);
        }

        return $this->condition
            ? $this->target->{$key}
            : $this->target;
    }

    /**
     * Proxy a method call on the target.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        if (! $this->hasCondition) {
            $condition = $this->target->{$method}(...$parameters);

            return $this->condition($this->negateConditionOnCapture ? ! $condition : $condition);
        }

        return $this->condition
            ? $this->target->{$method}(...$parameters)
            : $this->target;
    }
}