diff --git a/PocomathInstance.mjs b/PocomathInstance.mjs
index a28744d..3ca4385 100644
--- a/PocomathInstance.mjs
+++ b/PocomathInstance.mjs
@@ -74,17 +74,38 @@ export default class PocomathInstance {
          throw new SyntaxError(`No implementations for ${name}`)
       }
       const tf_imps = {}
-      // TODO: handle nonempty dependencies
       for (const signature in imps) {
          const [deps, imp] = imps[signature]
          if (deps.length === 0) {
             tf_imps[signature] = imp
          } else {
-            throw new Error('Unimplemented')
+            const refs = {}
+            for (const dep of deps) {
+               // TODO: handle self dependencies
+               if (dep.slice(0,4) === 'self') {
+                  throw new Error('self-reference unimplemented')
+               }
+               // TODO: handle signature-specific dependencies
+               if (dep.includes('(')) {
+                  throw new Error('signature specific reference unimplemented')
+               }
+               refs[dep] = this._ensureBundle(dep) // just assume acyclic for now
+            }
+            tf_imps[signature] = imp(refs)
          }
       }
       const tf = typed(name, tf_imps)
       this[name] = tf
       return tf
    }
+
+   /**
+    * Ensure that the generated typed function is assigned to the given
+    * name and return it
+    */
+   _ensureBundle(name) {
+      const maybe = this[name]
+      if (typed.isTypedFunction(maybe)) return maybe
+      return this._bundle(name)
+   }
 }
diff --git a/generic/subtract.mjs b/generic/subtract.mjs
new file mode 100644
index 0000000..8a90697
--- /dev/null
+++ b/generic/subtract.mjs
@@ -0,0 +1,3 @@
+export const subtract = {
+   'any,any': [['add', 'negate'], ref => (x,y) => ref.add(x, ref.negate(y))]
+} 
diff --git a/number/all.mjs b/number/all.mjs
index 21a270a..395eb54 100644
--- a/number/all.mjs
+++ b/number/all.mjs
@@ -1,2 +1,3 @@
 export {add} from './add.mjs'
 export {negate} from './negate.mjs'
+export {subtract} from '../generic/subtract.mjs'
diff --git a/test/_pocomath.mjs b/test/_pocomath.mjs
index d1be328..2f2a0f2 100644
--- a/test/_pocomath.mjs
+++ b/test/_pocomath.mjs
@@ -2,11 +2,16 @@ import assert from 'assert'
 import math from '../pocomath.mjs'
 
 describe('The default full pocomath instance "math"', () => {
+   it('can subtract numbers', () => {
+      assert.strictEqual(math.subtract(12, 5), 7)
+   })
+
    it('can add numbers', () => {
       assert.strictEqual(math.add(3, 4), 7)
       assert.strictEqual(math.add(1.5, 2.5, 3.5), 7.5)
       assert.strictEqual(math.add(Infinity), Infinity)
    })
+
    it('can negate numbers', () => {
       assert.strictEqual(math.negate(-1), 1)
       assert.strictEqual(math.add(10, math.negate(3)), 7)