use $! for strictness instead of bang patterns