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,20 +1,21 @@
 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.');
+function verifierMethod(verifierMethod) {
+  return function(arg) {
+    if(!this.skipVerification) {
+      if(this.argValue === undefined) throw new ArgumentError(this.argName + ' argument must be provided.');
 
-    this.METHOD_NAME(arg);
-  }
+      verifierMethod.call(this, 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;
@@ -24,8 +25,7 @@
 
 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));
+    ArgVerifier.prototype[methodName] = verifierMethod(verifier[methodName]);
   }
 };
 
@@ -39,6 +39,4 @@
   }
 });
 
-ArgVerifier.prototype.ArgumentError = ArgumentError;
-
 module.exports = ArgVerifier;
Use new Function() rather than call() to improve performance even further.
