ash/authorizer.go
func A(name string, m fire.Matcher, h Handler) *Authorizer {
	// panic if matcher or handler is not set
	if m == nil || h == nil {
		panic("ash: missing matcher or handler")
	}

	// construct and return authorizer
	return &Authorizer{
		Matcher: m,
		Handler: func(ctx *fire.Context) ([]*Enforcer, error) {
			// begin trace
			ctx.Tracer.Push(name)

			// call handler
			enforcers, err := h(ctx)
			if err != nil {
				return nil, err
			}

			// finish trace
			ctx.Tracer.Pop()

			return enforcers, nil
		},
	}
}
func A(name string, m fire.Matcher, h Handler) *Authorizer {
	// panic if matcher or handler is not set
	if m == nil || h == nil {
		panic("ash: missing matcher or handler")
	}

	// construct and return authorizer
	return &Authorizer{
		Matcher: m,
		Handler: func(ctx *fire.Context) ([]*Enforcer, error) {
			// begin trace
			ctx.Tracer.Push(name)

			// call handler
			enforcers, err := h(ctx)
			if err != nil {
				return nil, err
			}

			// finish trace
			ctx.Tracer.Pop()

			return enforcers, nil
		},
	}
}
// A is a short-hand function to construct an authorizer. It will also add tracing
// code around the execution of the authorizer.