In reply to DVCoder:
Yes, that is the preferred way of doing it. All of the do_*() methods can be used without needed to use the field macros. This paper shows how to implement them.