code: function Mockumentary (defaults) {
      // if argument is an array the create a single mock method
      // instead of a mock object faction
      if (Array.isArray(defaults)) {
          return buildMockAttribute(()=> defaults)
      }
      // return new mock factory constructor
      else {
          return function (args) {
              return buildMock(defaults, args)
          }
      }
  }
docs: @function Mockumentary
  
  instantiates new mock factory class that must be called in turn with new to
  instantiate a mock instace.
  
  both this constructor and the constructor it creates accept the same types
  of arguments. the arguments to this constructor provide the default methods
  and properties for the mock object while each mock instance can be called
  with arguments that override the defaults.
  
  mock methods are specified with the method name and a value to be returned
  when the method is called.
  
  mock methods that use Mockumentary's method generator use arrow functions.
  
  foo: ()=> true - will always return true when foo is called
  foo: ()=> [true, false] - returns true, false, true, false ...
  
  custom mock methods must be specified with classic functions.
  
  foo: function () {return true} - custom method that returns true
  
  mock properties are specified by providing the value for the property.
  
  foo: 'bar' - property with value 'bar'
  
  @param {object} defaults
  
  @returns {Mockumentary}