From scanning the code, it looks to me you're analysing it up to three times. That just feels wrong to me, whether you're using OO or not. (And up to two times, you create an object, call a method on it, then the object is discarded).

Also, you set a severity in $self, but isn't the severity already implied by the type of object returned from parse_body?