Hi, I want to implement `interface` or `dependency injection pattern`. Finally I want to implement an extensible web framework. For example, I have a Context object containing a Logger attributes. I just define the interfaces that Logger should satisfy. Then users can pass their own Logger instance to construct Context object. My goal is to achieve a loosely coupled application.
However using function pointers directly makes it hard to extend object. type Animal* = object id: int sleepImpl: proc (a: Animal) {.nimcall, gcsafe.} barkImpl: proc (a: Animal, b: int, c: int): string {.nimcall, gcsafe.} danceImpl: proc (a: Animal, b: string): string {.nimcall, gcsafe.} People* = object pet: Animal proc sleep(a: Animal) = discard proc bark(a: Animal, b: int, c: int): string = result = $(a.id + b + c) proc dance(a: Animal, b: string): string = result = b proc newAnimal*(id: int): Animal = result.id = 1314 result.sleepImpl = sleep result.barkImpl = bark result.danceImpl = dance let people = People(pet: newAnimal(12)) doAssert people.pet.barkImpl(people.pet, 12, 14) == "1340" Run If I can't use generics to implement interfaces, I maybe implement something like `vtables` in C++ or `fat pointer` in Rust(Using macros or so). Experiment Code: [https://github.com/xflywind/shene](https://github.com/xflywind/shene)