package Ġe cs Ċ Ċ private Ġvar ĠENT ITY _ ID _ COUNTER Ġ= Ġ 0 L Ċ Ċ class ĠEntity ( ĊĠĠĠ Ġ/** ĠThe Ġinitial Ġ[ components ] Ġof Ġthis Ġentity . Ġ*/ ĊĠĠĠ Ġvar arg Ġcomponents : ĠComponent Ċ ) Ġ: ĠIterable < Component > Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġunique Ġ[ id ] Ġassociated Ġwith Ġthis Ġentity Ġinstance . Ġ*/ ĊĠĠĠ Ġval Ġid Ġ= Ġ++ ENTITY _ ID _ COUNTER ĊĊĠĠĠ Ġprivate Ġval Ġcomponents Ġ= Ġmutable Map Of < Long , ĠComponent >() ĊĊĠĠĠ Ġ/** ĠThe Ġscene Ġin Ġwhich Ġthis Ġentity Ġis Ġcontained , Ġor Ġnull Ġif Ġit Ġhas Ġno Ġscene . Ġ*/ ĊĠĠĠ Ġvar Ġscene : ĠScene ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġfirst Ġoccurrence Ġof Ġa Ġcomponent Ġof Ġthe Ġspecified Ġgeneric Ġtype , Ġor Ġ` null ` Ġif Ġnone Ġwere Ġfound . Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠComponent > Ġget () Ġ= Ġget ( T :: class . java ) Ġas ĠT ? ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġfirst Ġoccurrence Ġof Ġa Ġcomponent Ġof Ġthe Ġspecified Ġ[ type ], Ġor Ġ` null ` Ġif Ġnone Ġwere Ġfound . Ġ*/ ĊĠĠĠ Ġfun Ġget ( type : ĠClass <* >) Ġ= Ġcomponents . values . find Ġ{ Ġc Ġ-> Ġc . java Class Ġ== Ġtype Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġall Ġcomponents Ġof Ġthe Ġspecified Ġgeneric Ġtype , Ġor Ġ` null ` Ġif Ġnone Ġwere Ġfound . Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠComponent > ĠgetAll () Ġ= ĠgetAll ( T :: class . java ) Ġas ĠList < T > ĊĊĠĠĠ Ġ/** ĠReturns Ġall Ġcomponents Ġof Ġthe Ġspecified Ġ[ type ], Ġor Ġ` null ` Ġif Ġnone Ġwere Ġfound . Ġ*/ ĊĠĠĠ Ġfun ĠgetAll ( type : ĠClass <* >) Ġ= Ġcomponents . values . filter Ġ{ Ġc Ġ-> Ġc . java Class Ġ== Ġtype Ġ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġnew Ġ[ component ] Ġto Ġthis Ġentity . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġa Ġcomponent Ġwith Ġthe Ġsame Ġ[ id ][ Component . id ] Ġis Ġalready Ġattached . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd ( component : ĠComponent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire (! components . containsKey ( component . id )) Ġ{ Ġ" Component Ġwith ĠID Ġ${ component . id } Ġis Ġalready Ġattached " Ġ} ĊĠĠĠĠĠĠĠ Ġcomponents [ component . id ] Ġ= Ġcomponent ĊĠĠĠĠĠĠĠ Ġcomponent . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġscene ?. apply Ġ{ Ġadd Component ( component ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġspecified Ġ[ component ], Ġif Ġit Ġis Ġattached Ġto Ġthis Ġentity . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġcomponent Ġis Ġnot Ġattached Ġto Ġthis Ġentity , ĊĠĠĠĠ Ġ* Ġor Ġif Ġit Ġis Ġa Ġ[ Transform ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( component : ĠComponent ) Ġ= Ġremove ( component . id ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġcomponent Ġassociated Ġwith Ġthe Ġspecified Ġ[ id ]. ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġ[ id ] Ġdoes Ġnot Ġmatch Ġa Ġcomponent , ĊĠĠĠĠ Ġ* Ġor Ġif Ġit Ġis Ġassociated Ġwith Ġthe Ġtransform . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( id : ĠLong ): ĠComponent Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( components . containsKey ( id )) Ġ{ Ġ" There Ġwas Ġno Ġcomponent Ġwith ĠID Ġ$ id " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( id Ġ!= Ġtransform . id ) Ġ{ Ġ" Tri ed Ġto Ġremove Ġtransform Ġfrom Ġentity Ġwith ĠID Ġ${ this . id }" Ġ} ĊĠĠĠĠĠĠĠ Ġscene ?. apply Ġ{ Ġremove Component ( components [ id ] !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġcomponents [ id ] !!. parent Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġcomponents . remove ( id ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġan Ġiterator Ġover Ġthe Ġcomponents Ġof Ġthis Ġobject . Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= Ġcomponents . values . iterator () ĊĊĠĠĠ Ġ/** ĠThe Ġ[ transform ] Ġof Ġthis Ġentity . Ġ*/ ĊĠĠĠ Ġval Ġtransform Ġ= ĠTransform () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( transform ) ĊĠĠĠĠĠĠĠ Ġcomponents . forEach (:: add ) ĊĠĠĠ Ġ} Ċ }