Geo::Compass::Variation works for me, though I suspect that term is more common in the nautical world.
One technical comment on your code is that it makes more sense for _calculate to return the X,Y,Z magnetic field components and leave the atan2 fiddling to mag_dec and mag_inc. (Maybe mag_dec should have an alias, mag_var.) Since someone might find an interesting use for that information, you might rename _calculate to mag_field and document it as a part of the interface.
BTW, the technical report has some test data you could use in your module tests.