   fullClickableSelector = ->
     config.clickableSelectors.join(',')
 
-  isInstant = (linkOrDescendant) ->
-    element = e.closest(linkOrDescendant, fullInstantSelector())
-    # Allow users to configure up.link.config.instantSelectors.push('a')
-    # but opt out individual links with [up-instant=false].
-    return element && !e.matches(element, '[up-instant=false], [up-follow=false]')
+  isFollowDisabled = (link) ->
+    return e.matches(link, config.noFollowSelectors.join(','))
+
+  isPreloadDisabled = (link) ->
+    return e.matches(link, config.noPreloadSelectors.join(','))
+
+  isInstantDisabled = (link) ->
+    return e.matches(link, config.noInstantSelectors.join(','))
 
   ###**
   @property up.link.config

    )

  config = new up.Config ->
    preloadDelay: 90
    followSelectors: combineFollowableSelectors(LINKS_WITH_REMOTE_HTML, ATTRIBUTES_SUGGESTING_FOLLOW).concat(LINKS_WITH_LOCAL_HTML)
    instantSelectors: ['[up-instant]']
    preloadSelectors: combineFollowableSelectors(LINKS_WITH_REMOTE_HTML, ['[up-preload]'])
    clickableSelectors: LINKS_WITH_LOCAL_HTML.concat ['[up-emit]', '[up-accept]', '[up-dismiss]', '[up-clickable]']

  fullFollowSelector = ->
    config.followSelectors.join(',')

    link = up.fragment.get(link)
    return e.matches(link, fullFollowSelector()) && !isFollowDisabled(link)

  ###**
  Makes sure that the given link will be [followed](/up.follow)
  by Unpoly instead of making a full page load.
