There are numerous modules on CPAN that do this already in different ways for you. And sure, your way is fine too.
Here are some:
Class::Struct,
Class::MethodMaker,
Class::Accessor,
Class::Generate,
Class::Class,
Class::Contract,
Class::AccessorMaker.