protected function getValueSource($property)
    {
        // Check for a presenter-specific override
        $overlay = $this->processTemplateOverride($property, $this->overlay);
        if (isset($overlay)) {
            return $overlay;
        }

        // Check if the method to-be-called exists on the target object - if so, don't check any further
        // injection locations
        $on = $this->itemIterator ? $this->itemIterator->current() : $this->item;
        if (isset($on->$property) || method_exists($on, $property)) {
            return null;
        }

        // Check for a presenter-specific override
        $underlay = $this->processTemplateOverride($property, $this->underlay);
        if (isset($underlay)) {
            return $underlay;
        }

        // Then for iterator-specific overrides
        if (array_key_exists($property, self::$iteratorProperties)) {
            $source = self::$iteratorProperties[$property];
            /** @var TemplateIteratorProvider $implementor */
            $implementor = $source['implementor'];
            if ($this->itemIterator) {
                // Set the current iterator position and total (the object instance is the first item in
                // the callable array)
                $implementor->iteratorProperties(
                    $this->itemIterator->key(),
                    $this->itemIteratorTotal
                );
            } else {
                // If we don't actually have an iterator at the moment, act like a list of length 1
                $implementor->iteratorProperties(0, 1);
            }
            return $source;
        }

        // And finally for global overrides
        if (array_key_exists($property, self::$globalProperties)) {
            return self::$globalProperties[$property];  //get the method call
        }

        // No value
        return null;
    }