def method_missing(method, *args)
      package, punctuation = method.to_s.sub(/([=!?])?\z/, ''), $1

      assignment = punctuation == '='

      unless assignment || args.empty?
        raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
      end

      case punctuation
        when '=', '!'
          config = packages[package] = PackageConfig.new

          assignment ? Array(args.first).each { |arg|
            config.send("#{arg}=", true)
          } : config
        when '?'
          include?(package)
        else
          self[package]
      end
    end
def method_missing(method, *args)
      package, punctuation = method.to_s.sub(/([=!?])?\z/, ''), $1

      assignment = punctuation == '='

      unless assignment || args.empty?
        raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
      end

      case punctuation
        when '=', '!'
          config = packages[package] = PackageConfig.new

          assignment ? Array(args.first).each { |arg|
            config.send("#{arg}=", true)
          } : config
        when '?'
          include?(package)
        else
          self[package]
      end
    end
call-seq:
   config.package                # package configuration
   config.package = 'foo'        # equivalent to: config.package.foo = true
   config.package = %w[foo bar]  # see above, multiple
   config.package!               # reset package configuration
   config.package?               # see whether package is enabled/included

 Convenience accessors to individual package configurations.