// run // Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main type S struct{ m1Called, m2Called bool } func (s *S) M1(int) (int, int) { s.m1Called = true return 0, 0 } func (s *S) M2(int) (int, int) { s.m2Called = true return 0, 0 } type C struct { calls []func(int) (int, int) } func makeC() Funcs { return &C{} } func (c *C) Add(fn func(int) (int, int)) Funcs { c.calls = append(c.calls, fn) return c } func (c *C) Call() { for _, fn := range c.calls { fn(0) } } type Funcs interface { Add(func(int) (int, int)) Funcs Call() } func main() { s := &S{} c := makeC().Add(s.M1).Add(s.M2) c.Call() if !s.m1Called || !s.m2Called { panic("missed method call") } }