code: function environment(methods, properties) {
      // Need to check if this.method and this.property are set incase
      // we're calling bilby.environment()
      var self = this instanceof environment && !this.method && !this.property ? this : create(environment.prototype),
          i;
  
      methods = methods || {};
      properties = properties || {};
  
      self.method = curry(function(name, predicate, f) {
          var newMethods = extend(methods, singleton(name, (methods[name] || []).concat({
              predicate: predicate,
              f: f
          })));
          return environment(newMethods, properties);
      });
  
      self.property = curry(function(name, value) {
          var newProperties = extend(properties, singleton(name, value));
          return environment(methods, newProperties);
      });
  
      self.envConcat = function(extraMethods, extraProperties) {
          var newMethods = {},
              newProperties = {},
              i;
  
          for(i in methods) {
              newMethods[i] = methods[i].concat(extraMethods[i]);
          }
          for(i in extraMethods) {
              if(i in newMethods) continue;
              newMethods[i] = extraMethods[i];
          }
  
          return environment(
              newMethods,
              extend(properties, extraProperties)
          );
      };
  
      self.envAppend = function(e) {
          return e.envConcat(methods, properties);
      };
  
      for(i in methods) {
          if(self[i]) throw new Error("Method " + i + " already in environment.");
          self[i] = makeMethod(methods[i]);
      }
  
      for(i in properties) {
          if(self[i]) throw new Error("Property " + i + " already in environment.");
          self[i] = properties[i];
      }
  
      return self;
  }
docs: ## environment(methods = {}, properties = {})
  
  method(name, predicate, f) - adds an multimethod implementation
  property(name, value) - sets a property to value
  envConcat(extraMethods, extraProperties) - adds methods + properties
  envAppend(e) - combines two environemts, biased to `e`