         finally
           expect(threw).toBe true
           expect(Example::bar).toBe 1 # was mixed in!
+
+      it 'should invoke a mixin post-mixing hook after mixing in', ->
+
+      it 'should invoke an options post-mixing hook before a mixin post-mixing hook', ->
 
   describe 'protomixing options', ->
 

      beforeEach ->
        @mixin = MIXINS.default_mixin()

      ###
        This is also a good example of pre-mixin hook usage;
        to validate that the mixing class satisfies a certain schema.
      ###
      it 'should invoke a pre-mixing hook with the prototype context', ->
        premixing_hook = ->
          unless @special_key?
            throw new errors.NotImplemented "Wanted schema key special_key"
        mix_opts = {premixing_hook}

        spyOn(mix_opts, 'premixing_hook').and.callThrough()

        expect(=>
          class Example
            # special_key is not on the prototype; schema unsatisfied, hook will throw
          Example.mixinto_proto @mixin, mix_opts, ['arg1', 'arg2']
        ).toThrow new errors.NotImplemented('Wanted schema key special_key')

        class Example
          # special_key is on the prototype; schema satisfied, hook won't throw
          special_key: 1
        Example.mixinto_proto @mixin, mix_opts, ['arg1', 'arg2']

        expect(mix_opts.premixing_hook).toHaveBeenCalledWith(['arg1', 'arg2'])
        expect(mix_opts.premixing_hook.calls.count()).toBe 2

        {object, args} = mix_opts.premixing_hook.calls.mostRecent()

        # test that the right context was used
        expect(object).toBe(Example::)
        expect(args...).toEqual(['arg1', 'arg2'])

      it 'should invoke the pre-mixing hook before mixing in properties', ->
        mix_opts = {premixing_hook: ->}
        error = new Error
        threw = false

          expect(Example::foo).toBeUndefined() # wasn't mixed in!
          expect(mix_opts.premixing_hook).toHaveBeenCalledWith(['arg1', 'arg2'])

      it 'should invoke a mixin pre-mixing hook before mixing in', ->

      it 'should invoke an options pre-mixing hook before a mixin pre-mixing hook', ->

    describe 'post-mixing hooks', ->

      beforeEach ->
        @mixin = MIXINS.default_mixin()

      it 'should invoke an options post-mixing hook with the prototype context', ->
        mix_opts = {postmixing_hook: ->}
        spyOn(mix_opts, 'postmixing_hook').and.callThrough()

