+++++++++++++++++++++ about dice project +++++++++++++++++++++++++++++
1. assert_not_nil tests if an object/class exist i.e. not nil.
2. assert_not_equal tests if two variables are not equal
3. using object_id is a better way to test if two object are really really equal
+++++++++++++++++ about inheritance ++++++++++++++++
1. All classes inherit from Object.
2. A parent method can be invoked via super.
3. super does not work cross method i.e. super. some method does not work.
+++++++++++++++++++++++++ about modules +++++++++++++++++++++++++
1. unlike classes, modules can't be instantiated.
2. assert_nothing_raised tests if any exception of the given type is raised.
3. classes methods override module methods
+++++++++++++++++++++++++ about scope +++++++++++++++++++++
1. NameError is raised if the class does not exist or not in scope.
2. two classes of the same name are not the same if they don't belong to the same module, i.e. they are in different scopes.
3. when calling bare classes, it assumes the current scope.
4. using the prefix scope forces the global class.
5. Constants are defined using upper case letters.
6. Classes and modules are constants.
7. the method const_get looks up for a constant explicitly in a class or a module.
8. Class.constants list all constants in class.
+++++++++++++++++++ about class methods +++++++++++++++++++++++
1.instantiated classes are object of type Object
2. classes are object of type Class and Object
3. all classes have methods inherited from Object and thus an_object.methods.size > 1. The same is true for classes.
4. methods can be defined on any particular object by using def objec.somemethod and  somemethod can't affect any other object instantiation of the same class. A NoMethodError exception is raised if somethode is invoked on those.
5. singleton methods can be defined on classes too
6. singleton class methods and instantiated methods are independent.
7. classes singleton method defined variables and instance variables are not shared
8. class statement returns the value of the last expression in the definition of the class
9. self inside class is class object not instance
10. you can use def self.some_class_method or class << self def some_class_method to define class method inside the class.
11. to call class methods from instance method by object_name.class.some_class_method
++++++++++++++++++++ about message passing ++++++++++++++++
1. a method can be called using SomeClass.SomeMethod, or by sending it a message SomeClass.send(:SomeMethod).
2. one can check if a method is defined for a class using SomeClass.respond_to?(SomeMethod).
3. input arguments can be passed in as an extra argument of .send.
4. method_missing can be redefined to pass your own message when the method is missing.
5. A well-behaved catcher can be created by modifying an existing method such as respond_to? and method_missing.
+++++++++++++++++++++ about proxy project ++++++++++++++++++++++++
1. you can override the method missing to allow for any method to be passed from a proxy to the actual target by using a method.send
+++++++++++++++++++++++++++++ about to_str ++++++++++++++++++++++++++
1. TypeError exception is raised when the wrong type is passed as an input.