Wouldn't this realisation be simplier?
function AddEffectForDuration takes string Attach, unit Target, string Effect, real Duration returns nothing
local effect e
call AddSpecialEffectTargetUnitBJ( Attach, Target, Effect)
set e = GetLastCreatedEffectBJ()
call TriggerSleepAction( Duration )
call DestroyEffectBJ( e )
endfunction
Or there is some hidden dangers?