Your point is a good one. It is necessary to hand-roll methods that do anything non-simple, like keeping is_from_west_coast() in the correct state.
Because of that, C:MM can only be used for simple methods. In my case, that means C:MM methods are usually private methods, and public methods are hand-rolled.
I am looking forward to automatic method constructors getting smarter in the future. I could imagine a module that combines something like Params::Validate with C:MM, like so:
optional => [
'zone_file' => [
'error on parameter failure'