[eluser]m4rw3r[/eluser]
You end up in an infinite loop: controller -> my_class::delete() -> $message::delete() -> my_class::delete() -> $message::delete() -> ...
This because $message is tied to the my_class model, and according to the Data Mapper pattern is the model responsible for the deletion of the child objects ($message in this case), and you've overwritten the delete method (which $message::delete() calls).
To avoid this, why not just use $this->my_class->find($id)->delete(); ? (Or even AR, when it is so simple?)