Refactored how entry points work.
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f3b723c..b366d31 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,28 +1,20 @@
 
--
-    repo: git@github.com:pre-commit/pre-commit-hooks
+-   repo: git@github.com:pre-commit/pre-commit-hooks
     sha: 12794c1c19c001e3d05bcfe316b4f93b414035a7
     hooks:
-        -
-            id: pyflakes
+        -   id: pyflakes
             files: '\.py$'
-        -
-            id: debug-statements
+        -   id: debug-statements
             files: '\.py$'
-        -
-            id: trailing-whitespace
+        -   id: trailing-whitespace
             files: '\.(py|sh|yaml)'
-        -
-            id: name-tests-test
+        -   id: name-tests-test
             files: 'tests/.*\.py'
 
--
-    repo: git@github.com:pre-commit/pre-commit
+-   repo: git@github.com:pre-commit/pre-commit
     sha: c77d65d9cbbcf30e2be005f5ba8b63447deedc1e
     hooks:
-        -
-            id: validate_manifest
+        -   id: validate_manifest
             files: /manifest.yaml
-        -
-            id: validate_config
+        -   id: validate_config
             files: /\.pre-commit-config.yaml
diff --git a/manifest.yaml b/manifest.yaml
index 78fc797..00b48d9 100644
--- a/manifest.yaml
+++ b/manifest.yaml
@@ -1,25 +1,21 @@
 
--
-    id: pyflakes
+-   id: pyflakes
     name: Pyflakes
     description: This validator runs pyflakes.
     entry: pyflakes
     language: python
--
-    id: debug-statements
+-   id: debug-statements
     name: Debug Statements (Python)
     description: This hook checks that debug statements (pdb, ipdb, pudb) are not imported on commit.
     entry: debug-statement-hook
     language: python
--
-    id: trailing-whitespace
+-   id: trailing-whitespace
     name: Trim Trailing Whitespace
     description: This hook trims trailing whitespace.
     entry: trailing-whitespace-fixer
     language: python
--
-    id: name-tests-test
+-   id: name-tests-test
     name: Tests should end in _test.py
     description: This verifies that test files are named correctly
     entry: name-tests-test
-    language: python
\ No newline at end of file
+    language: python
diff --git a/pre_commit_hooks/debug_statement_hook.py b/pre_commit_hooks/debug_statement_hook.py
index 5f16727..565740e 100644
--- a/pre_commit_hooks/debug_statement_hook.py
+++ b/pre_commit_hooks/debug_statement_hook.py
@@ -4,6 +4,8 @@
 import collections
 import sys
 
+from pre_commit_hooks.util import entry
+
 
 DEBUG_STATEMENTS = set(['pdb', 'ipdb', 'pudb'])
 
@@ -43,6 +45,7 @@
         return 0
 
 
+@entry
 def debug_statement_hook(argv):
     parser = argparse.ArgumentParser()
     parser.add_argument('filenames', nargs='*', help='Filenames to run')
@@ -55,9 +58,5 @@
     return retv
 
 
-def entry():
-    return debug_statement_hook(sys.argv[1:])
-
-
 if __name__ == '__main__':
-    sys.exit(entry())
\ No newline at end of file
+    sys.exit(debug_statement_hook())
diff --git a/pre_commit_hooks/tests_should_end_in_test.py b/pre_commit_hooks/tests_should_end_in_test.py
index 92f2031..37db03c 100644
--- a/pre_commit_hooks/tests_should_end_in_test.py
+++ b/pre_commit_hooks/tests_should_end_in_test.py
@@ -3,7 +3,10 @@
 
 import sys
 
+from pre_commit_hooks.util import entry
 
+
+@entry
 def validate_files(argv):
     retcode = 0
     for filename in argv:
@@ -18,9 +21,5 @@
     return retcode
 
 
-def entry():
-    return validate_files(sys.argv[1:])
-
-
 if __name__ == '__main__':
     sys.exit(entry())
diff --git a/pre_commit_hooks/trailing_whitespace_fixer.py b/pre_commit_hooks/trailing_whitespace_fixer.py
index 5038e6e..bf016af 100644
--- a/pre_commit_hooks/trailing_whitespace_fixer.py
+++ b/pre_commit_hooks/trailing_whitespace_fixer.py
@@ -3,7 +3,10 @@
 import sys
 from plumbum import local
 
+from pre_commit_hooks.util import entry
 
+
+@entry
 def fix_trailing_whitespace(argv):
     parser = argparse.ArgumentParser()
     parser.add_argument('filenames', nargs='*', help='Filenames to fix')
@@ -22,9 +25,5 @@
         return 0
 
 
-def entry():
-    fix_trailing_whitespace(sys.argv[1:])
-
-
 if __name__ == '__main__':
-    sys.exit(entry())
+    sys.exit(fix_trailing_whitespace())
diff --git a/pre_commit_hooks/util.py b/pre_commit_hooks/util.py
new file mode 100644
index 0000000..22d13c4
--- /dev/null
+++ b/pre_commit_hooks/util.py
@@ -0,0 +1,16 @@
+
+import functools
+import sys
+
+
+def entry(func):
+    """Allows a function that has `argv` as an argument to be used as a
+    commandline entry.  This will make the function callable using either
+    explicitly passed argv or defaulting to sys.argv[1:]
+    """
+    @functools.wraps(func)
+    def wrapper(argv=None):
+        if argv is None:
+            argv = sys.argv[1:]
+        return func(argv)
+    return wrapper
diff --git a/setup.py b/setup.py
index ed41748..42afa6a 100644
--- a/setup.py
+++ b/setup.py
@@ -13,9 +13,9 @@
     ],
     entry_points={
         'console_scripts': [
-            'debug-statement-hook = pre_commit_hooks.debug_statement_hook:entry',
-            'trailing-whitespace-fixer = pre_commit_hooks.trailing_whitespace_fixer:entry',
-            'name-tests-test = pre_commit_hooks.tests_should_end_in_test:entry',
+            'debug-statement-hook = pre_commit_hooks.debug_statement_hook:debug_statement_hook',
+            'trailing-whitespace-fixer = pre_commit_hooks.trailing_whitespace_fixer:fix_trailing_whitespace',
+            'name-tests-test = pre_commit_hooks.tests_should_end_in_test:validate_files',
         ],
     },
 )
diff --git a/tests/util_test.py b/tests/util_test.py
new file mode 100644
index 0000000..72f58c3
--- /dev/null
+++ b/tests/util_test.py
@@ -0,0 +1,28 @@
+
+import mock
+import pytest
+import sys
+
+from pre_commit.util import entry
+
+
+@pytest.fixture
+def entry_func():
+    @entry
+    def func(argv):
+        return argv
+
+    return func
+
+
+def test_explicitly_passed_argv_are_passed(entry_func):
+    input = object()
+    ret = entry_func(input)
+    assert ret is input
+
+
+def test_no_arguments_passed_uses_argv(entry_func):
+    argv = [1, 2, 3, 4]
+    with mock.patch.object(sys, 'argv', argv):
+        ret = entry_func()
+        assert ret == argv[1:]