diff --git a/callbacks.go b/callbacks.go index c1fac81..e541f5a 100644 --- a/callbacks.go +++ b/callbacks.go @@ -80,7 +80,19 @@ func getMethods(value reflect.Value, name string) []reflect.Value { for i := 0; i < value.NumField(); i++ { field := value.Field(i) fieldType := t.Field(i) - if fieldType.IsExported() && fieldType.Anonymous { + if !fieldType.IsExported() { + continue + } + + // Hooks on exported embedded fields should be called. + if fieldType.Anonymous { + receivers = append(receivers, field) + continue + } + + // Hooks on exported fields that are not exported, + // but are tagged with `embed:""` should be called. + if _, ok := fieldType.Tag.Lookup("embed"); ok { receivers = append(receivers, field) } } diff --git a/kong_test.go b/kong_test.go index a7c03b2..874b90b 100644 --- a/kong_test.go +++ b/kong_test.go @@ -2413,9 +2413,19 @@ func (e *EmbeddedCallback) AfterApply() error { return nil } +type taggedEmbeddedCallback struct { + Tagged bool +} + +func (e *taggedEmbeddedCallback) AfterApply() error { + e.Tagged = true + return nil +} + type EmbeddedRoot struct { EmbeddedCallback - Root bool + Tagged taggedEmbeddedCallback `embed:""` + Root bool } func (e *EmbeddedRoot) AfterApply() error { @@ -2432,6 +2442,9 @@ func TestEmbeddedCallbacks(t *testing.T) { EmbeddedCallback: EmbeddedCallback{ Embedded: true, }, + Tagged: taggedEmbeddedCallback{ + Tagged: true, + }, Root: true, } assert.Equal(t, expected, actual)