package main

import (
    "fmt"
    "reflect"
)

func Decorate(impl interface{}) interface{} {
                fn := reflect.ValueOf(impl)

        inner := func(in []reflect.Value) []reflect.Value {
            f := reflect.ValueOf(impl)

            fmt.Println("Stuff before")
            // ...

            ret := f.Call(in)

            fmt.Println("Stuff after")
            // ...

            return ret
        }

                v := reflect.MakeFunc(fn.Type(), inner)

        return v.Interface()
}

var Add = Decorate(
    func (a, b int) int {
        return a + b
    },
).(func(a, b int) int)



func main() {
    fmt.Println(Add(1, 2))
}