protected function _normalizeMethodCallable($callable)
    {
        if (is_object($callable) && is_callable($callable)) {
            return array($callable, '__invoke');
        }

        $amtPartsRequired = 2; // Number of parts required for a valid callable
        $origCallable     = $callable; // Preserving the original value for reporting

        // If stringable, try to separate into parts
        try {
            $callable = $this->_normalizeString($callable);
            $callable = explode('::', $callable, $amtPartsRequired);
        } catch (InvalidArgumentException $e) {
            // Just continue
        }

        // Normalizing to array
        $callable = $this->_normalizeArray($callable);
        $callable = array_slice($callable, 0, $amtPartsRequired);

        // Array must have exactly 2 parts
        if (count($callable) !== $amtPartsRequired) {
            throw $this->_createOutOfRangeException($this->__('The callable must have at least %1$s parts', array($amtPartsRequired)), null, null, $origCallable);
        }

        // First value must be an object or string, because stringable objects should be valid targets
        if (!is_string($callable[0]) && !is_object($callable[0])) {
            throw $this->_createOutOfRangeException($this->__('The first part must be an object or a string'), null, null, $origCallable);
        }

        // The second value must be a string or stringable
        try {
            $callable[1] = $this->_normalizeString($callable[1]);
        } catch (InvalidArgumentException $e) {
            throw $this->_createOutOfRangeException($this->__('The second part must be a string or stringable'), null, $e, $origCallable);
        }

        return $callable;
    }