diff --git a/docs/changelog.txt b/docs/changelog.txt
index c54ba12..90c1ed3 100644
--- a/docs/changelog.txt
+++ b/docs/changelog.txt
@@ -4,10 +4,12 @@
 CHANGELOG
 =========
 
-2012/XX/XX Version 0.8.1
+2012/XX/XX Version 1.0.0
 ------------------------
 
-* BUGFIX: `create_autospec` works correctly for calling mocked unbound methods
+The standard library version!
+
+* `mocksignature`, along with the `mocksignature` argument to `patch`, removed
 
 
 2012/02/13 Version 0.8.0
diff --git a/mock.py b/mock.py
index 31a1147..640203b 100644
--- a/mock.py
+++ b/mock.py
@@ -3,7 +3,7 @@
 # Copyright (C) 2007-2012 Michael Foord & the mock team
 # E-mail: fuzzyman AT voidspace DOT org DOT uk
 
-# mock 0.9.0
+# mock 1.0
 # http://www.voidspace.org.uk/python/mock/
 
 # Released subject to the BSD License
@@ -16,7 +16,6 @@
 __all__ = (
     'Mock',
     'MagicMock',
-    'mocksignature',
     'patch',
     'sentinel',
     'DEFAULT',
@@ -29,7 +28,7 @@
 )
 
 
-__version__ = '0.9.0alpha1'
+__version__ = '1.0alpha1'
 
 
 import pprint
@@ -136,43 +135,7 @@
 )
 
 
-# getsignature and mocksignature heavily "inspired" by
-# the decorator module: http://pypi.python.org/pypi/decorator/
-# by Michele Simionato
-
-def _getsignature(func, skipfirst):
-    if inspect is None:
-        raise ImportError('inspect module not available')
-
-    if inspect.isclass(func):
-        func = func.__init__
-        # will have a self arg
-        skipfirst = True
-    elif not (inspect.ismethod(func) or inspect.isfunction(func)):
-        func = func.__call__
-
-    regargs, varargs, varkwargs, defaults = inspect.getargspec(func)
-
-    # instance methods need to lose the self argument
-    if getattr(func, self, None) is not None:
-        regargs = regargs[1:]
-
-    _msg = ("_mock_ is a reserved argument name, can't mock signatures using "
-            "_mock_")
-    assert '_mock_' not in regargs, _msg
-    if varargs is not None:
-        assert '_mock_' not in varargs, _msg
-    if varkwargs is not None:
-        assert '_mock_' not in varkwargs, _msg
-    if skipfirst:
-        regargs = regargs[1:]
-
-    signature = inspect.formatargspec(regargs, varargs, varkwargs, defaults,
-                                      formatvalue=lambda value: "")
-    return signature[1:-1], func
-
-
-def _getsignature2(func, skipfirst, instance=False):
+def _getsignature(func, skipfirst, instance=False):
     if inspect is None:
         raise ImportError('inspect module not available')
 
@@ -211,7 +174,7 @@
     if not _callable(func):
         return
 
-    result = _getsignature2(func, skipfirst, instance)
+    result = _getsignature(func, skipfirst, instance)
     if result is None:
         return
     signature, func = result
@@ -271,12 +234,12 @@
 def _set_signature(mock, original, instance=False):
     # creates a function with signature (*args, **kwargs) that delegates to a
     # mock. It still does signature checking by calling a lambda with the same
-    # signature as the original. This is effectively mocksignature2.
+    # signature as the original.
     if not _callable(original):
         return
 
     skipfirst = isinstance(original, ClassTypes)
-    result = _getsignature2(original, skipfirst, instance)
+    result = _getsignature(original, skipfirst, instance)
     if result is None:
         # was a C function (e.g. object().__init__ ) that can't be mocked
         return
@@ -301,41 +264,6 @@
     return funcopy
 
 
-def mocksignature(func, mock=None, skipfirst=False):
-    """
-    mocksignature(func, mock=None, skipfirst=False)
-
-    Create a new function with the same signature as `func` that delegates
-    to `mock`. If `skipfirst` is True the first argument is skipped, useful
-    for methods where `self` needs to be omitted from the new function.
-
-    If you don't pass in a `mock` then one will be created for you.
-
-    The mock is set as the `mock` attribute of the returned function for easy
-    access.
-
-    Functions returned by `mocksignature` have many of the same attributes
-    and assert methods as a mock object.
-
-    `mocksignature` can also be used with classes. It copies the signature of
-    the `__init__` method.
-
-    When used with callable objects (instances) it copies the signature of the
-    `__call__` method.
-    """
-    if mock is None:
-        mock = Mock()
-    signature, func = _getsignature(func, skipfirst)
-    src = "lambda %(signature)s: _mock_(%(signature)s)" % {
-        'signature': signature
-    }
-
-    funcopy = eval(src, dict(_mock_=mock))
-    _copy_func_details(func, funcopy)
-    _setup_func(funcopy, mock)
-    return funcopy
-
-
 def _setup_func(funcopy, mock):
     funcopy.mock = mock
 
@@ -809,8 +737,7 @@
             if not _is_instance_mock(value):
                 setattr(type(self), name, _get_method(name, value))
                 original = value
-                real = lambda *args, **kw: original(self, *args, **kw)
-                value = mocksignature(value, real, skipfirst=True)
+                value = lambda *args, **kw: original(self, *args, **kw)
             else:
                 # only set _new_name and not name so that mock_calls is tracked
                 # but not method calls
@@ -1138,7 +1065,7 @@
 
     def __init__(
             self, getter, attribute, new, spec, create,
-            mocksignature, spec_set, autospec, new_callable, kwargs
+            spec_set, autospec, new_callable, kwargs
         ):
         if new_callable is not None:
             if new is not DEFAULT:
@@ -1157,7 +1084,6 @@
         self.spec = spec
         self.create = create
         self.has_local = False
-        self.mocksignature = mocksignature
         self.spec_set = spec_set
         self.autospec = autospec
         self.kwargs = kwargs
@@ -1167,7 +1093,7 @@
     def copy(self):
         patcher = _patch(
             self.getter, self.attribute, self.new, self.spec,
-            self.create, self.mocksignature, self.spec_set,
+            self.create, self.spec_set,
             self.autospec, self.new_callable, self.kwargs
         )
         patcher.attribute_name = self.attribute_name
@@ -1321,8 +1247,7 @@
         elif autospec is not False:
             # spec is ignored, new *must* be default, spec_set is treated
             # as a boolean. Should we check spec is not None and that spec_set
-            # is a bool? mocksignature should also not be used. Should we
-            # check this?
+            # is a bool?
             if new is not DEFAULT:
                 raise TypeError(
                     "autospec creates the mock for you. Can't specify "
@@ -1340,8 +1265,6 @@
             raise TypeError("Can't pass kwargs to a mock we aren't creating")
 
         new_attr = new
-        if self.mocksignature:
-            new_attr = mocksignature(original, new)
 
         self.temp_original = original
         self.is_local = local
@@ -1396,19 +1319,19 @@
 
 def _patch_object(
         target, attribute, new=DEFAULT, spec=None,
-        create=False, mocksignature=False, spec_set=None, autospec=False,
+        create=False, spec_set=None, autospec=False,
         new_callable=None, **kwargs
     ):
     """
     patch.object(target, attribute, new=DEFAULT, spec=None, create=False,
-                 mocksignature=False, spec_set=None, autospec=False,
+                 spec_set=None, autospec=False,
                  new_callable=None, **kwargs)
 
     patch the named member (`attribute`) on an object (`target`) with a mock
     object.
 
     `patch.object` can be used as a decorator, class decorator or a context
-    manager. Arguments `new`, `spec`, `create`, `mocksignature`, `spec_set`,
+    manager. Arguments `new`, `spec`, `create`, `spec_set`,
     `autospec` and `new_callable` have the same meaning as for `patch`. Like
     `patch`, `patch.object` takes arbitrary keyword arguments for configuring
     the mock object it creates.
@@ -1418,13 +1341,13 @@
     """
     getter = lambda: target
     return _patch(
-        getter, attribute, new, spec, create, mocksignature,
+        getter, attribute, new, spec, create,
         spec_set, autospec, new_callable, kwargs
     )
 
 
 def _patch_multiple(target, spec=None, create=False,
-        mocksignature=False, spec_set=None, autospec=False,
+        spec_set=None, autospec=False,
         new_callable=None, **kwargs
     ):
     """Perform multiple patches in a single call. It takes the object to be
@@ -1440,7 +1363,7 @@
     used as a context manager.
 
     `patch.multiple` can be used as a decorator, class decorator or a context
-    manager. The arguments `spec`, `spec_set`, `create`, `mocksignature`,
+    manager. The arguments `spec`, `spec_set`, `create`,
     `autospec` and `new_callable` have the same meaning as for `patch`. These
     arguments will be applied to *all* patches done by `patch.multiple`.
 
@@ -1460,13 +1383,13 @@
     items = list(kwargs.items())
     attribute, new = items[0]
     patcher = _patch(
-        getter, attribute, new, spec, create, mocksignature, spec_set,
+        getter, attribute, new, spec, create, spec_set,
         autospec, new_callable, {}
     )
     patcher.attribute_name = attribute
     for attribute, new in items[1:]:
         this_patcher = _patch(
-            getter, attribute, new, spec, create, mocksignature, spec_set,
+            getter, attribute, new, spec, create, spec_set,
             autospec, new_callable, {}
         )
         this_patcher.attribute_name = attribute
@@ -1476,7 +1399,7 @@
 
 def patch(
         target, new=DEFAULT, spec=None, create=False,
-        mocksignature=False, spec_set=None, autospec=False,
+        spec_set=None, autospec=False,
         new_callable=None, **kwargs
     ):
     """
@@ -1507,21 +1430,14 @@
     A more powerful form of `spec` is `autospec`. If you set `autospec=True`
     then the mock with be created with a spec from the object being replaced.
     All attributes of the mock will also have the spec of the corresponding
-    attribute of the object being replaced. Methods and functions being mocked
-    will have their arguments checked and will raise a `TypeError` if they are
-    called with the wrong signature (similar to `mocksignature`). For mocks
-    replacing a class, their return value (the 'instance') will have the same
-    spec as the class.
+    attribute of the object being replaced. Methods and functions being
+    mocked will have their arguments checked and will raise a `TypeError` if
+    they are called with the wrong signature. For mocks replacing a class,
+    their return value (the 'instance') will have the same spec as the class.
 
     Instead of `autospec=True` you can pass `autospec=some_object` to use an
     arbitrary object as the spec instead of the one being replaced.
 
-    If `mocksignature` is True then the patch will be done with a function
-    created by mocking the one being replaced. If the object being replaced is
-    a class then the signature of `__init__` will be copied. If the object
-    being replaced is a callable object then the signature of `__call__` will
-    be copied.
-
     By default `patch` will fail to replace attributes that don't exist. If
     you pass in `create=True`, and the attribute doesn't exist, patch will
     create the attribute for you when the patched function is called, and
@@ -1550,7 +1466,7 @@
     """
     getter, attribute = _get_target(target)
     return _patch(
-        getter, attribute, new, spec, create, mocksignature,
+        getter, attribute, new, spec, create,
         spec_set, autospec, new_callable, kwargs
     )
 
@@ -2114,9 +2030,8 @@
     mock will use the corresponding attribute on the `spec` object as their
     spec.
 
-    Functions or methods being mocked will have their arguments checked in a
-    similar way to `mocksignature` to check that they are called with the
-    correct signature.
+    Functions or methods being mocked will have their arguments checked
+    to check that they are called with the correct signature.
 
     If `spec_set` is True then attempting to set attributes that don't exist
     on the spec object will raise an `AttributeError`.
@@ -2183,7 +2098,7 @@
             continue
 
         if isinstance(spec, FunctionTypes) and entry in FunctionAttributes:
-            # allow a mock to actually be a function from mocksignature
+            # allow a mock to actually be a function
             continue
 
         # XXXX do we need a better way of getting attributes without
@@ -2214,7 +2129,7 @@
             skipfirst = _must_skip(spec, entry, is_type)
             _check_signature(original, new, skipfirst=skipfirst)
 
-        # so functions created with mocksignature become instance attributes,
+        # so functions created with _set_signature become instance attributes,
         # *plus* their underlying mock exists in _mock_children of the parent
         # mock. Adding to _mock_children may be unnecessary where we are also
         # setting as an instance attribute?
diff --git a/tests/testhelpers.py b/tests/testhelpers.py
index 8f8b6d7..1b3dd2f 100644
--- a/tests/testhelpers.py
+++ b/tests/testhelpers.py
@@ -6,8 +6,7 @@
 
 from mock import (
     call, _Call, create_autospec,
-    MagicMock, Mock, ANY, _CallList,
-    mocksignature
+    MagicMock, Mock, ANY, _CallList
 )
 
 from datetime import datetime
@@ -424,7 +423,7 @@
 
 
     def test_builtin_functions_types(self):
-        # we could replace builtin functions / methods with a mocksignature
+        # we could replace builtin functions / methods with a function
         # with *args / **kwargs signature. Using the builtin method type
         # as a spec seems to work fairly well though.
         class BuiltinSubclass(list):
@@ -814,28 +813,28 @@
 class TestCallList(unittest2.TestCase):
 
     def test_args_list_contains_call_list(self):
-        for mock in Mock(), mocksignature(lambda *args, **kwargs: None):
-            self.assertIsInstance(mock.call_args_list, _CallList)
+        mock = Mock()
+        self.assertIsInstance(mock.call_args_list, _CallList)
 
-            mock(1, 2)
-            mock(a=3)
-            mock(3, 4)
-            mock(b=6)
+        mock(1, 2)
+        mock(a=3)
+        mock(3, 4)
+        mock(b=6)
 
-            for kall in call(1, 2), call(a=3), call(3, 4), call(b=6):
-                self.assertTrue(kall in mock.call_args_list)
+        for kall in call(1, 2), call(a=3), call(3, 4), call(b=6):
+            self.assertTrue(kall in mock.call_args_list)
 
-            calls = [call(a=3), call(3, 4)]
-            self.assertTrue(calls in mock.call_args_list)
-            calls = [call(1, 2), call(a=3)]
-            self.assertTrue(calls in mock.call_args_list)
-            calls = [call(3, 4), call(b=6)]
-            self.assertTrue(calls in mock.call_args_list)
-            calls = [call(3, 4)]
-            self.assertTrue(calls in mock.call_args_list)
+        calls = [call(a=3), call(3, 4)]
+        self.assertTrue(calls in mock.call_args_list)
+        calls = [call(1, 2), call(a=3)]
+        self.assertTrue(calls in mock.call_args_list)
+        calls = [call(3, 4), call(b=6)]
+        self.assertTrue(calls in mock.call_args_list)
+        calls = [call(3, 4)]
+        self.assertTrue(calls in mock.call_args_list)
 
-            self.assertFalse(call('fish') in mock.call_args_list)
-            self.assertFalse([call('fish')] in mock.call_args_list)
+        self.assertFalse(call('fish') in mock.call_args_list)
+        self.assertFalse([call('fish')] in mock.call_args_list)
 
 
     def test_call_list_str(self):
diff --git a/tests/testmagicmethods.py b/tests/testmagicmethods.py
index 6dac3cc..b636341 100644
--- a/tests/testmagicmethods.py
+++ b/tests/testmagicmethods.py
@@ -51,13 +51,7 @@
         mock.__getitem__ = f
         self.assertFalse(mock.__getitem__ is f)
         self.assertEqual(mock['foo'], (mock, 'fish'))
-
-        # When you pull the function back of the *instance*
-        # the first argument (self) is removed
-        def instance_f(name):
-            pass
-        self.assertEqual(inspect.getargspec(mock.__getitem__),
-                         inspect.getargspec(instance_f))
+        self.assertEqual(mock.__getitem__('foo'), (mock, 'fish'))
 
         mock.__getitem__ = mock
         self.assertTrue(mock.__getitem__ is mock)
@@ -438,7 +432,8 @@
 
         # this seems like it should work, but is hard to do without introducing
         # other api inconsistencies. Failure message could be better though.
-        self.assertRaises(TypeError, setattr, m, '__iter__', [3].__iter__)
+        m.__iter__ = [3].__iter__
+        self.assertRaises(TypeError, iter, m)
 
 
     def test_magic_method_type(self):
diff --git a/tests/testmock.py b/tests/testmock.py
index 31ea50c..886f9bf 100644
--- a/tests/testmock.py
+++ b/tests/testmock.py
@@ -14,7 +14,7 @@
     call, DEFAULT, patch, sentinel,
     MagicMock, Mock, NonCallableMock,
     NonCallableMagicMock, _CallList,
-    mocksignature, create_autospec
+    create_autospec
 )
 
 
@@ -854,7 +854,6 @@
     def test_arg_lists(self):
         mocks = [
             Mock(),
-            mocksignature(lambda *args, **kwargs: None),
             MagicMock(),
             NonCallableMock(),
             NonCallableMagicMock()
@@ -879,10 +878,6 @@
                 mock.reset_mock()
                 assert_attrs(mock)
 
-            if not isinstance(mock, Mock):
-                # the mocksignature
-                continue
-
             mock.foo()
             mock.foo.bar(1, a=3)
             mock.foo(1).bar().baz(3)
@@ -955,48 +950,48 @@
 
 
     def test_assert_has_calls_any_order(self):
-        for mock in Mock(), mocksignature(lambda *args, **kwargs: None):
-            mock(1, 2)
-            mock(a=3)
-            mock(3, 4)
-            mock(b=6)
-            mock(b=6)
+        mock = Mock()
+        mock(1, 2)
+        mock(a=3)
+        mock(3, 4)
+        mock(b=6)
+        mock(b=6)
 
-            kalls = [
-                call(1, 2), ({'a': 3},),
-                ((3, 4),), ((), {'a': 3}),
-                ('', (1, 2)), ('', {'a': 3}),
-                ('', (1, 2), {}), ('', (), {'a': 3})
-            ]
-            for kall in kalls:
-                mock.assert_has_calls([kall], any_order=True)
+        kalls = [
+            call(1, 2), ({'a': 3},),
+            ((3, 4),), ((), {'a': 3}),
+            ('', (1, 2)), ('', {'a': 3}),
+            ('', (1, 2), {}), ('', (), {'a': 3})
+        ]
+        for kall in kalls:
+            mock.assert_has_calls([kall], any_order=True)
 
-            for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
-                self.assertRaises(
-                    AssertionError, mock.assert_has_calls,
-                    [kall], any_order=True
-                )
+        for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
+            self.assertRaises(
+                AssertionError, mock.assert_has_calls,
+                [kall], any_order=True
+            )
 
-            kall_lists = [
-                [call(1, 2), call(b=6)],
-                [call(3, 4), call(1, 2)],
-                [call(b=6), call(b=6)],
-            ]
+        kall_lists = [
+            [call(1, 2), call(b=6)],
+            [call(3, 4), call(1, 2)],
+            [call(b=6), call(b=6)],
+        ]
 
-            for kall_list in kall_lists:
-                mock.assert_has_calls(kall_list, any_order=True)
+        for kall_list in kall_lists:
+            mock.assert_has_calls(kall_list, any_order=True)
 
-            kall_lists = [
-                [call(b=6), call(b=6), call(b=6)],
-                [call(1, 2), call(1, 2)],
-                [call(3, 4), call(1, 2), call(5, 7)],
-                [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
-            ]
-            for kall_list in kall_lists:
-                self.assertRaises(
-                    AssertionError, mock.assert_has_calls,
-                    kall_list, any_order=True
-                )
+        kall_lists = [
+            [call(b=6), call(b=6), call(b=6)],
+            [call(1, 2), call(1, 2)],
+            [call(3, 4), call(1, 2), call(5, 7)],
+            [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
+        ]
+        for kall_list in kall_lists:
+            self.assertRaises(
+                AssertionError, mock.assert_has_calls,
+                kall_list, any_order=True
+            )
 
     def test_assert_has_calls(self):
         kalls1 = [
@@ -1009,7 +1004,7 @@
         kalls2.extend(call.bam(set(), foo={}).fish([1]).call_list())
 
         mocks = []
-        for mock in Mock(), mocksignature(lambda *args, **kwargs: None):
+        for mock in Mock(), MagicMock():
             mock(1, 2)
             mock(a=3)
             mock(3, 4)
@@ -1039,39 +1034,39 @@
 
 
     def test_assert_any_call(self):
-        for mock in Mock(), mocksignature(lambda *args, **kwargs: None):
-            mock(1, 2)
-            mock(a=3)
-            mock(1, b=6)
+        mock = Mock()
+        mock(1, 2)
+        mock(a=3)
+        mock(1, b=6)
 
-            mock.assert_any_call(1, 2)
-            mock.assert_any_call(a=3)
-            mock.assert_any_call(1, b=6)
+        mock.assert_any_call(1, 2)
+        mock.assert_any_call(a=3)
+        mock.assert_any_call(1, b=6)
 
-            self.assertRaises(
-                AssertionError,
-                mock.assert_any_call
-            )
-            self.assertRaises(
-                AssertionError,
-                mock.assert_any_call,
-                1, 3
-            )
-            self.assertRaises(
-                AssertionError,
-                mock.assert_any_call,
-                a=4
-            )
+        self.assertRaises(
+            AssertionError,
+            mock.assert_any_call
+        )
+        self.assertRaises(
+            AssertionError,
+            mock.assert_any_call,
+            1, 3
+        )
+        self.assertRaises(
+            AssertionError,
+            mock.assert_any_call,
+            a=4
+        )
 
 
-    def test_mock_calls_mocksignature(self):
+    def test_mock_calls_create_autospec(self):
         def f(a, b):
             pass
         obj = Iter()
         obj.f = f
 
         funcs = [
-            mocksignature(f), create_autospec(f),
+            create_autospec(f),
             create_autospec(obj).f
         ]
         for func in funcs:
diff --git a/tests/testmocksignature.py b/tests/testmocksignature.py
deleted file mode 100644
index 7bdc536..0000000
--- a/tests/testmocksignature.py
+++ /dev/null
@@ -1,345 +0,0 @@
-# Copyright (C) 2007-2012 Michael Foord & the mock team
-# E-mail: fuzzyman AT voidspace DOT org DOT uk
-# http://www.voidspace.org.uk/python/mock/
-
-import inspect
-
-from tests.support import unittest2
-
-from mock import Mock, mocksignature, patch
-
-
-class Something(object):
-    def __init__(self, foo, bar=10):
-        pass
-    def __call__(self, foo, bar=5):
-        pass
-
-something = Something(1, 2)
-
-
-def f(a, b, c):
-    pass
-
-
-class TestMockSignature(unittest2.TestCase):
-
-    def test_function(self):
-        def f(a):
-            pass
-        mock = Mock()
-
-        f2  = mocksignature(f, mock)
-        self.assertIs(f2.mock, mock)
-
-        self.assertRaises(TypeError, f2)
-        mock.return_value = 3
-        self.assertEqual(f2('foo'), 3)
-        mock.assert_called_with('foo')
-        f2.mock.assert_called_with('foo')
-
-
-    def test_function_without_explicit_mock(self):
-        def f(a):
-            pass
-
-        f2  = mocksignature(f)
-        self.assertIsInstance(f2.mock, Mock)
-
-        self.assertRaises(TypeError, f2)
-        f2.mock.return_value = 3
-        self.assertEqual(f2('foo'), 3)
-        f2.mock.assert_called_with('foo')
-
-
-    def test_method(self):
-        class Foo(object):
-            def method(self, a, b):
-                pass
-
-        f = Foo()
-        mock = Mock()
-        mock.return_value = 3
-        f.method = mocksignature(f.method, mock)
-        self.assertEqual(f.method('foo', 'bar'), 3)
-        mock.assert_called_with('foo', 'bar')
-
-
-    def test_function_with_defaults(self):
-        def f(a, b=None):
-            pass
-        mock = Mock()
-        f2  = mocksignature(f, mock)
-        f2(3)
-        mock.assert_called_with(3, None)
-        mock.reset_mock()
-
-        f2(1, 7)
-        mock.assert_called_with(1, 7)
-        mock.reset_mock()
-
-        f2(b=1, a=7)
-        mock.assert_called_with(7, 1)
-        mock.reset_mock()
-
-        a = object()
-        def f(a=a):
-            pass
-        f2 = mocksignature(f, mock)
-        f2()
-        mock.assert_called_with(a)
-
-
-    def test_introspection(self):
-        def f(a, *args, **kwargs):
-            pass
-        f2 = mocksignature(f, f)
-        self.assertEqual(inspect.getargspec(f), inspect.getargspec(f2))
-
-        def f(a, b=None, c=3, d=object()):
-            pass
-        f2 = mocksignature(f, f)
-        self.assertEqual(inspect.getargspec(f), inspect.getargspec(f2))
-
-
-    def test_function_with_varargs_and_kwargs(self):
-        def f(a, b=None, *args, **kwargs):
-            return (a, b, args, kwargs)
-        f2 = mocksignature(f, f)
-        self.assertEqual(f2(3, 4, 5, x=6, y=9), (3, 4, (5,), {'x': 6, 'y': 9}))
-        self.assertEqual(f2(3, x=6, y=9, b='a'), (3, 'a', (), {'x': 6, 'y': 9}))
-
-        def f(*args):
-            pass
-        g = mocksignature(f)
-        g.mock.return_value = 3
-        self.assertEqual(g(1, 2, 'many'), 3)
-        self.assertEqual(g(), 3)
-        self.assertRaises(TypeError, lambda: g(a=None))
-
-        def f(**kwargs):
-            pass
-        g = mocksignature(f)
-        g.mock.return_value = 3
-        self.assertEqual(g(), 3)
-        self.assertEqual(g(a=None, b=None), 3)
-        self.assertRaises(TypeError, lambda: g(None))
-
-
-    def test_mocksignature_with_patch(self):
-        mock = Mock()
-
-        def f(a, b, c):
-            pass
-        mock.f = f
-
-        @patch.object(mock, 'f', mocksignature=True)
-        def test(mock_f):
-            self.assertRaises(TypeError, mock.f, 3, 4)
-            self.assertRaises(TypeError, mock.f, 3, 4, 5, 6)
-            mock.f(1, 2, 3)
-
-            mock_f.assert_called_with(1, 2, 3)
-            mock.f.mock.assert_called_with(1, 2, 3)
-
-        test()
-
-        @patch('tests.support.SomeClass.wibble', mocksignature=True)
-        def test(mock_wibble):
-            from tests.support import SomeClass
-
-            instance = SomeClass()
-            self.assertRaises(TypeError, instance.wibble, 1)
-            instance.wibble()
-
-            mock_wibble.assert_called_with(instance)
-            instance.wibble.mock.assert_called_with(instance)
-
-        test()
-
-
-    @unittest2.skipUnless(__debug__, 'assert disabled when run with -O/OO')
-    def test_mocksignature_with_reserved_arg(self):
-        def f(_mock_):
-            pass
-        self.assertRaises(AssertionError, lambda: mocksignature(f))
-
-        def f(_mock_=None):
-            pass
-        self.assertRaises(AssertionError, lambda: mocksignature(f))
-
-        def f(*_mock_):
-            pass
-        self.assertRaises(AssertionError, lambda: mocksignature(f))
-
-        def f(**_mock_):
-            pass
-        self.assertRaises(AssertionError, lambda: mocksignature(f))
-
-
-    def test_mocksignature_class(self):
-        MockedSomething = mocksignature(Something)
-
-        result = MockedSomething(5, 23)
-        self.assertIs(result, MockedSomething.mock.return_value)
-
-        MockedSomething(1)
-        MockedSomething.mock.assert_caled_with(1, 10)
-
-        self.assertRaises(TypeError, MockedSomething)
-
-
-    def test_mocksignature_callable(self):
-        mocked_something = mocksignature(something)
-
-        result = mocked_something(5, 23)
-        self.assertIs(result, mocked_something.mock.return_value)
-
-        mocked_something(1)
-        mocked_something.mock.assert_caled_with(1, 5)
-
-        self.assertRaises(TypeError, mocked_something)
-
-
-    def test_patch_mocksignature_class(self):
-        original_something = Something
-        something_name = '%s.Something' % __name__
-        @patch(something_name, mocksignature=True)
-        def test(MockSomething):
-            Something(3, 5)
-            MockSomething.assert_called_with(3, 5)
-
-            Something(6)
-            MockSomething.assert_called_with(6, 10)
-
-            self.assertRaises(TypeError, Something)
-        test()
-        self.assertIs(Something, original_something)
-
-
-    def test_patch_mocksignature_callable(self):
-        original_something = something
-        something_name = '%s.something' % __name__
-        @patch(something_name, mocksignature=True)
-        def test(MockSomething):
-            something(3, 4)
-            MockSomething.assert_called_with(3, 4)
-
-            something(6)
-            MockSomething.assert_called_with(6, 5)
-
-            self.assertRaises(TypeError, something)
-        test()
-        self.assertIs(something, original_something)
-
-
-    def test_patchobject_mocksignature(self):
-        class something(object):
-            def meth(self, a, b, c):
-                pass
-
-        original = something.__dict__['meth']
-
-        @patch.object(something, 'meth', mocksignature=True)
-        def test(_):
-            self.assertIsNot(something.__dict__['meth'], original)
-            thing = something()
-            thing.meth(1, 2, 3)
-            self.assertRaises(TypeError, thing.meth, 1)
-
-        test()
-        self.assertIs(something.__dict__['meth'], original)
-
-        thing = something()
-
-        original = thing.meth
-        @patch.object(thing, 'meth', mocksignature=True)
-        def test(_):
-            thing.meth(1, 2, 3)
-            self.assertRaises(TypeError, thing.meth, 1)
-
-        test()
-        self.assertEqual(thing.meth, original)
-
-        # when patching instance methods using mocksignatures we used to
-        # replace the bound method with an instance attribute on unpatching.
-        self.assertNotIn('meth', thing.__dict__)
-
-
-    def test_assert_called_with(self):
-        func = mocksignature(f)
-
-        self.assertRaises(AssertionError, func.assert_called_with)
-        self.assertRaises(AssertionError, func.assert_called_once_with)
-
-        func(1, 2, 3)
-        func.assert_called_with(1, 2, 3)
-        self.assertRaises(AssertionError, func.assert_called_with, 4, 5, 6)
-        func.assert_called_once_with(1, 2, 3)
-        self.assertRaises(AssertionError, func.assert_called_once_with,
-                          4, 5, 6)
-
-
-    def test_mock_attributes(self):
-        func = mocksignature(f)
-
-        return_value = func.return_value
-        self.assertIsInstance(return_value, Mock)
-        self.assertIsNone(func.side_effect)
-        self.assertFalse(func.called)
-        self.assertIsNone(func.call_args)
-        self.assertEqual(func.call_count, 0)
-        self.assertEqual(func.method_calls, [])
-        self.assertEqual(func.call_args_list, [])
-        self.assertIs(func._mock_children, func.mock._mock_children)
-
-        self.assertIs(func(1, 2, 3), return_value)
-
-        self.assertTrue(func.called)
-        self.assertEqual(func.call_args, ((1, 2, 3), {}))
-        self.assertEqual(func.call_count, 1)
-        self.assertEqual(func.method_calls, [])
-        self.assertEqual(func.call_args_list, [((1, 2, 3), {})])
-        func.method_calls.append('foo')
-
-        return_value()
-        func.reset_mock()
-
-        self.assertEqual(return_value.call_count, False)
-        self.assertFalse(func.called)
-        self.assertIsNone(func.call_args)
-        self.assertEqual(func.call_count, 0)
-        self.assertEqual(func.method_calls, [])
-        self.assertEqual(func.call_args_list, [])
-        self.assertIs(func._mock_children, func.mock._mock_children)
-
-        func.side_effect = KeyError
-        self.assertRaises(KeyError, func, 1, 2, 3)
-        self.assertTrue(func.called)
-
-        func.side_effect = None
-        func.return_value = 'foo'
-        self.assertEqual(func(1, 2, 3), 'foo')
-        self.assertEqual(func.call_count, 2)
-
-
-    def test_return_value_from_existing_mock(self):
-        mock = Mock(return_value='foo')
-        func = mocksignature(f, mock)
-        self.assertEqual(func(1, 2, 3), 'foo')
-
-        mock.return_value = 'bar'
-        self.assertEqual(func(1, 2, 3), 'bar')
-
-
-    def test_side_effect_from_existing_mock(self):
-        mock = Mock(side_effect=KeyError)
-        func = mocksignature(f, mock)
-        self.assertRaises(KeyError, func, 1, 2, 3)
-
-        mock.side_effect = NameError
-        self.assertRaises(NameError, func, 1, 2, 3)
-
-
-if __name__ == '__main__':
-    unittest2.main()
diff --git a/tests/testpatch.py b/tests/testpatch.py
index 3c4f823..5c08bfc 100644
--- a/tests/testpatch.py
+++ b/tests/testpatch.py
@@ -610,7 +610,7 @@
         foo = {}
 
         @patch('%s.SomeClass' % __name__, object())
-        @patch('%s.SomeClass' % __name__, object(), mocksignature=True)
+        @patch('%s.SomeClass' % __name__, object(), autospec=True)
         @patch.object(SomeClass, object())
         @patch.dict(foo)
         def some_name():
