package Ġcom . github . ch ristop h pick l . der ba uer . misc Ċ Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Suppress (" unused ") Ċ fun ĠAny ?. enforce When Branches () Ġ{ Ċ } Ċ Ċ open Ġclass ĠDer B au er Exception ( ĊĠĠĠ Ġmessage : ĠString , ĊĠĠĠ Ġcause : ĠException ? Ġ= Ġnull Ċ ) Ġ: ĠRuntimeException ( message , Ġcause ) Ċ Ċ fun Ġrestrict Method Usage ( ĊĠĠĠ Ġbase PackageName : ĠString , ĊĠĠĠ Ġrequired Annotation : ĠK Class < out ĠAnnotation >, ĊĠĠĠ Ġskip Classes : ĠSet < String > Ġ= Ġset Of (" mu . internal . Location Aware K Logger ") Ċ ) Ġ{ ĊĠĠĠ Ġval Ġstack Trace Elements Ġ= ĠThread . currentThread (). stack Trace . toList () ĊĊĠĠĠ Ġval Ġhas Some one Required Annotation Ġ= Ġstack Trace Elements ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . className . startsWith ( base PackageName ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. any Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠClass . forName ( stack . className ). declared Methods . first Ġ{ Ġit . name Ġ== Ġstack . methodName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . getAnnotation ( required Annotation . java ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġskip Ġ= Ġif Ġ( skip Classes . isEmpty ()) Ġfalse Ġelse Ġstack Trace Elements . any Ġ{ Ġskip Classes . contains ( it . className ) Ġ} ĊĊĠĠĠ Ġif Ġ(! has Some one Required Annotation Ġ&& Ġ! skip ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Method Ġmust Ġbe Ġannotated Ġwith Ġ@ ${ required Annotation . simple Name } Ġin Ġorder Ġto Ġuse Ġit ! Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 0 Ġ... ĠThread . get StackTrace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 Ġ... Ġrestricted Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 Ġ... Ġinvoking Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inv oking Ġmethod Ġwas : Ġ${ stack Trace Elements [ 2 ]. to Label () }") ĊĠĠĠ Ġ} Ċ } Ċ