This document discusses metaprogramming in Ruby. It begins with an introduction to metaprogramming as writing programs that write programs, rather than code generation. It then discusses why metaprogramming is commonly used in Ruby through examples like attr_accessor. It notes some drawbacks like writing difficult to understand code. It covers topics like method dispatch, Ruby classes, eval, instance_eval, class_eval, and scoping.