protected function canRun(array $options, $chainName = null, $kind = null, $callbackName = null, $invoker = null)
    {
        # Closures or other objects will cause $callbackName to be int. A skip can't be registered
        # to them because their callbacks have no "name". They can be skipped only with the "if" option.
        if ($chainName && isset($this->skips[$chainName][$kind][$callbackName])) {
            if (!isset($this->skips[$chainName][$kind][$callbackName]['if'])) {
                # No 'if' option passed.
                return false;
            }
            
            $conditions = $this->skips[$chainName][$kind][$callbackName]['if'];
            foreach ($conditions as $condition) {
                if (is_string($condition)) {
                    if (!(!$invoker($condition))) {
                        return false;
                    }
                } else {
                    if (!(call_user_func($condition))) {
                        return false;
                    }
                }
            }
        } elseif (isset($options['if'])) {
            foreach ($options['if'] as $condition) {
                if (is_string($condition)) {
                    if (!$invoker($condition)) {
                        return false;
                    }
                } else {
                    if (!call_user_func($condition)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }