def update!(data)
      # can't be used @data.merge because []= is differently defined (below)
      case data
      when Hash
      when MMETools::Config
        data = data.to_hash
      else raise ArgumentError, "Only Hash objects or MMETools::Config objects admited"
      end
      data.each do |key, value|
        self[key] = value
      end
    end
def update!(data)
      # can't be used @data.merge because []= is differently defined (below)
      case data
      when Hash
      when MMETools::Config
        data = data.to_hash
      else raise ArgumentError, "Only Hash objects or MMETools::Config objects admited"
      end
      data.each do |key, value|
        self[key] = value
      end
    end
creates a MMETools::Config object to gracefully keep configuration
 parameters for any app. if a Hash +data+ is given it is used to populate
 it.
   cfg = MMETools::Config.new(
     :param1 => 1,
     :param2 => 2
   )
 If a +block+ is passed, it can be used to setup additional data. self is
 yielded tot tha block. For instance:
   cfg = MMETools::Config.new do |c|
     c.param1 = 1
     c.param2 = 2
   end
 Of course, both idioms can be combined though block is the last to be
 evaluated, so its actions may overwrite hash created config data.
 updates kept configuration with +data+ (Hash or another MMETools::Config
 object. If a key already exists the corresponding value updates.