var ArgumentError = require('./ArgumentError');
var topiarist = require('topiarist');

function verifierMethod() {
  if(!this.skipVerification) {
    if(this.argValue === undefined) throw new this.ArgumentError(this.argName + ' argument must be provided.');

    this.METHOD_NAME(arg);
  }

  if(this.argsVerifier.argIndex < this.argsVerifier.arguments.length) {
    this.argsVerifier.constructor.pendingVerifier = this.argsVerifier;
  }

  return this.argsVerifier;
}
var verifierMethodStr = verifierMethod.toString().substring(verifierMethod.toString().indexOf('{') + 1, verifierMethod.toString().lastIndexOf('}'));

function ArgVerifier(argsVerifier, argName, argValue) {
  this.argsVerifier = argsVerifier;
  this.argName = argName;
  this.argValue = argValue;
}

ArgVerifier.addVerifier = function(verifier) {
  for(var methodName in verifier) {
    ArgVerifier.prototype['_' + methodName] = verifier[methodName];
    ArgVerifier.prototype[methodName] = new Function('arg', verifierMethodStr.replace('METHOD_NAME', '_' + methodName));
  }
};

Object.defineProperty(ArgVerifier.prototype, 'optionally', {
  get: function optionally() {
    if((this.argValue === undefined) || (this.argValue === null)) {
      this.skipVerification = true;
    }

    return this;
  }
});

ArgVerifier.prototype.ArgumentError = ArgumentError;

module.exports = ArgVerifier;

var ArgumentError = require('./ArgumentError');
var topiarist = require('topiarist');

function verifierMethod(verifierMethod) {
  return function(arg) {
    if(!this.skipVerification) {
      if(this.argValue === undefined) throw new ArgumentError(this.argName + ' argument must be provided.');

      verifierMethod.call(this, arg);
    }

    if(this.argsVerifier.argIndex < this.argsVerifier.arguments.length) {
      this.argsVerifier.constructor.pendingVerifier = this.argsVerifier;
    }

    return this.argsVerifier;
  };
}

function ArgVerifier(argsVerifier, argName, argValue) {
  this.argsVerifier = argsVerifier;
  this.argName = argName;
  this.argValue = argValue;
}

ArgVerifier.addVerifier = function(verifier) {
  for(var methodName in verifier) {
    ArgVerifier.prototype[methodName] = verifierMethod(verifier[methodName]);
  }
};

Object.defineProperty(ArgVerifier.prototype, 'optionally', {
  get: function optionally() {
    if((this.argValue === undefined) || (this.argValue === null)) {
      this.skipVerification = true;
    }

    return this;
  }
});

module.exports = ArgVerifier;

--- 
+++ 
@@ -1,21 +1,20 @@
 var ArgumentError = require('./ArgumentError');
 var topiarist = require('topiarist');
 
-function verifierMethod(verifierMethod) {
-  return function(arg) {
-    if(!this.skipVerification) {
-      if(this.argValue === undefined) throw new ArgumentError(this.argName + ' argument must be provided.');
+function verifierMethod() {
+  if(!this.skipVerification) {
+    if(this.argValue === undefined) throw new this.ArgumentError(this.argName + ' argument must be provided.');
 
-      verifierMethod.call(this, arg);
-    }
+    this.METHOD_NAME(arg);
+  }
 
-    if(this.argsVerifier.argIndex < this.argsVerifier.arguments.length) {
-      this.argsVerifier.constructor.pendingVerifier = this.argsVerifier;
-    }
+  if(this.argsVerifier.argIndex < this.argsVerifier.arguments.length) {
+    this.argsVerifier.constructor.pendingVerifier = this.argsVerifier;
+  }
 
-    return this.argsVerifier;
-  };
+  return this.argsVerifier;
 }
+var verifierMethodStr = verifierMethod.toString().substring(verifierMethod.toString().indexOf('{') + 1, verifierMethod.toString().lastIndexOf('}'));
 
 function ArgVerifier(argsVerifier, argName, argValue) {
   this.argsVerifier = argsVerifier;
@@ -25,7 +24,8 @@
 
 ArgVerifier.addVerifier = function(verifier) {
   for(var methodName in verifier) {
-    ArgVerifier.prototype[methodName] = verifierMethod(verifier[methodName]);
+    ArgVerifier.prototype['_' + methodName] = verifier[methodName];
+    ArgVerifier.prototype[methodName] = new Function('arg', verifierMethodStr.replace('METHOD_NAME', '_' + methodName));
   }
 };
 
@@ -39,4 +39,6 @@
   }
 });
 
+ArgVerifier.prototype.ArgumentError = ArgumentError;
+
 module.exports = ArgVerifier;
Use new Function() rather than call() to improve performance even further.
