     chain = this
 
     # create two spots in args for our 'fn' and 'index'
+    # (index 0, delete zero, add in two '')
     args.splice 0, 0, '', ''
 
-    # for each function in the array, if `selector` returns true
-    for fn,index in chain.array when selector fn, index
-      # put both of them in there as the first two args in the slots we created above
-      args[0] = fn
-      args[1] = index
-      # call the action with the `chain` as the `this` and our args
-      action.apply chain, args
-
-    # all done
-    return
+    # when doing the remove action on a function it messes up the `for fn,index`
+    # iteration loop.
+    # So, i pulled index out separately, and, I use array length changes to
+    # affect the index value. then it doesn't go up one when we just removed
+    # a function. and, it would go up if we added one, tho, I don't have an
+    # add action as part of select() stuff.
+
+    # length at the start of the first operation, and, index starts at zero.
+    length = chain.array.length
+    index = 0
+
+    # let's remember the results of each action
+    results = []
+
+    for fn in chain.array
+
+      # apply the action to the function only if the selector say so
+      if selector fn, index
+        # put both of them in there as the first two args in the slots we created above
+        args[0] = fn
+        args[1] = index
+
+        # call the action with the `chain` as the `this` and our args
+        result = action.apply chain, args
+
+        # compare length before the action and after the action
+        diff = chain.array.length - length
+
+        # apply the difference to the index.
+        # when we remove one it's -1 so we reduce the index.
+        index += diff
+
+        # and then update the length
+        length = chain.array.length
+
+        # gather each action's results
+        results.push result
+
+      # we do the normal increment by one for the loop.
+      # Note: this must happen every loop iteration
+      index++
+
+    # all done  TODO: how to gather results of action to return here...
+    return result:true, results:results
 
   # create a selector function capable of selecting the desired member functions
   # and then apply the utility functions to them.

  #  chain.remove 3
  #  chain.remove 'some-id'
  #  chain.remove fn1
  remove: (which) ->

    # find it based on the selector. may return an error
    index = @_findIndex which

      # for it, return the expected properties which call the function which
      # provides the error result.
      return ops =
        selector: selector
        error  : error.error
        disable: returnError
        enable : returnError
        remove : returnError
