adding some classes
some metaprograming learning