 )(@, ($, _, hlf) ->
   
   hlf.tip =
+    # It takes some boilerplate to write the plugins. To namespace when
+    # extending any jQuery API, we use custom `toString` helpers. Plugin
+    # namespaces (under the root`$.hlf`) each have a `debug` flag for granular
+    # logging.
     debug: off
     toString: _.memoize (context) ->
       switch context

          classNames.tip = 'js-tip js-snap-tip'
          classNames

  # Tip API
  # -------
  # Note that most of the interface is intended as protected.
  class Tip

    # The base constructor and `init` mostly do setup work that uses other
    # subroutines when needed. Note that we're also keeping `$triggers` and
    # `$context` as properties. `$context` is partly used to avoid directly
    # binding event listeners to triggers, which can improve performance and
    # allow dynamic binding.
    constructor: (@$triggers, options, @$context) ->
      for name, animation of options.animations when name isnt 'base'
        _.defaults animation, options.animations.base

    init: ->
      # Bind handler methods here after class setup completes.
      _.bindAll @, '_onTriggerMouseMove', '_setBounds'
      # The element represented by this API is `$tip`. We build it. Alias it to
      # `$el` for any mixins to consume.
      @_setTip = ($tip) => @$tip = @$el = $tip
      @_setTip $ '<div>'
      # Infer `doStem` and `doFollow` flags from respective `classNames` entries.
      @doStem = @classNames.stem isnt ''
      @doFollow = @classNames.follow isnt ''
      # Updated with `_setState`, `_state` toggles between: `awake`, `asleep`,
      # `waking`, `sleeping`. The use case behind these states is the tip will
      # remain visible and `awake` as long as there is a high enough frequency
      # of relevant mouse activity. This is achieved with a simple base
      # implementation around timers `_sleepCountdown` and `_wakeCountdown`.
      @_setState 'asleep'
      @_wakeCountdown = null
      @_sleepCountdown = null
      # `_$currentTrigger` helps manage trigger-related state.
      @_$currentTrigger = null
      # Tip instances start off rendered and bound.
      @_render()
      @_bind()
      # Also setup any context bindings.
      @_bindContext()
      # Do this for initially provided triggers.
      @_processTriggers()
      @_bindTriggers()

    # Process `$triggers` and setup content, event, and positioning aspects.
    _processTriggers: ($triggers) ->

Written with jQuery 1.7.2  
###

# ❧

# The base `tip` plugin does several things. It does basic parsing of trigger
# element attributes for the tip content. It can anchor itself to a trigger by
# selecting the best direction. It can follow the cursor. It toggles its
# appearance by fading in and out and resizing, all via configurable animations.
# It can display custom tip content. It uses of the `hlf.hoverIntent` event
# extension to prevent appearance 'thrashing.' Last, the tip object attaches to
# the context element. It acts as tip for the the current jQuery selection via
# event delegation.

# The extended `snapTip` plugin extends the base tip. It allows the tip to snap
# to the trigger element. And by default the tip locks into place. But turn on
# only one axis of snapping, and the tip will track the mouse only on the other
# axis. For example, snapping to the x-axis will only allow the tip to shift
# along the y-axis. The x will remain constant.

# ❧

# Export. Support AMD, CommonJS (Browserify), and browser globals.
((root, factory) ->
