protected function proxy()
    {
        $args = func_get_args();
        $method = array_shift($args);
        $callback = array($this->object, $method);

        if (!is_callable($callback)) {
            throw new \BadMethodCallException(
                sprintf(
                    'Cannot proxy "%s" to "%s": Unknown method.',
                    $method,
                    get_class($this->object)
                )
            );
        }

        $return = call_user_func_array($callback, $args);

        if ($return === $this->object) {
            // Return this decorator instead of the wrapped entity.
            $return = $this;
        }

        return $return;
    }