diff --git a/examples/variation/00positional/_exposed.py b/examples/variation/00positional/_exposed.py
index 9e0b8fa..73cac64 100644
--- a/examples/variation/00positional/_exposed.py
+++ b/examples/variation/00positional/_exposed.py
@@ -1,13 +1,13 @@
 
 
-def run(filename: str) -> None:
+def run(file_name: str) -> None:
     pass
 
 def main(argv=None):
     import argparse
     parser = argparse.ArgumentParser(description=None)
     parser.print_usage = parser.print_help
-    parser.add_argument('filename')
+    parser.add_argument('file_name')
     args = parser.parse_args(argv)
     run(**vars(args))
 
diff --git a/examples/variation/00positional/main.py b/examples/variation/00positional/main.py
index c462f30..55abce6 100644
--- a/examples/variation/00positional/main.py
+++ b/examples/variation/00positional/main.py
@@ -2,5 +2,5 @@ from handofcats import as_command
 
 
 @as_command
-def run(filename: str) -> None:
+def run(file_name: str) -> None:
     pass
diff --git a/examples/variation/01keyword/_exposed.py b/examples/variation/01keyword/_exposed.py
index 7f2ccfc..ac85a61 100644
--- a/examples/variation/01keyword/_exposed.py
+++ b/examples/variation/01keyword/_exposed.py
@@ -1,13 +1,13 @@
 
 
-def run(*, filename: str) -> None:
+def run(*, file_name: str) -> None:
     pass
 
 def main(argv=None):
     import argparse
     parser = argparse.ArgumentParser(description=None)
     parser.print_usage = parser.print_help
-    parser.add_argument('--filename', required=True)
+    parser.add_argument('--file-name', required=True)
     args = parser.parse_args(argv)
     run(**vars(args))
 
diff --git a/examples/variation/01keyword/main.py b/examples/variation/01keyword/main.py
index cdb8b67..9b2db1c 100644
--- a/examples/variation/01keyword/main.py
+++ b/examples/variation/01keyword/main.py
@@ -2,5 +2,5 @@ from handofcats import as_command
 
 
 @as_command
-def run(*, filename: str) -> None:
+def run(*, file_name: str) -> None:
     pass
diff --git a/examples/variation/02future-annotations/_exposed.py b/examples/variation/02future-annotations/_exposed.py
new file mode 100644
index 0000000..14da200
--- /dev/null
+++ b/examples/variation/02future-annotations/_exposed.py
@@ -0,0 +1,17 @@
+from __future__ import annotations
+
+
+def run(filename: str) -> None:
+    pass
+
+def main(argv=None):
+    import argparse
+    parser = argparse.ArgumentParser(description=None)
+    parser.print_usage = parser.print_help
+    parser.add_argument('filename')
+    args = parser.parse_args(argv)
+    run(**vars(args))
+
+
+if __name__ == '__main__':
+    main()
diff --git a/examples/variation/02future-annotations/main.py b/examples/variation/02future-annotations/main.py
new file mode 100644
index 0000000..716fd4e
--- /dev/null
+++ b/examples/variation/02future-annotations/main.py
@@ -0,0 +1,7 @@
+from __future__ import annotations
+from handofcats import as_command
+
+
+@as_command
+def run(filename: str) -> None:
+    pass
diff --git a/examples/variation/Makefile b/examples/variation/Makefile
index 72b608e..1bd04d0 100644
--- a/examples/variation/Makefile
+++ b/examples/variation/Makefile
@@ -1,4 +1,4 @@
-default: 00 01
+default: 00 01 02
 
 # positional arguments
 00:
@@ -7,3 +7,7 @@ default: 00 01
 # keyword arguments
 01:
 	python $@*/main.py --expose | tee $$(echo $@*)/_exposed.py
+
+# use `__future__ import annotations`
+02:
+	python $@*/main.py --expose | tee $$(echo $@*)/_exposed.py
diff --git a/handofcats/accessor.py b/handofcats/accessor.py
index e404ba8..8ac2586 100644
--- a/handofcats/accessor.py
+++ b/handofcats/accessor.py
@@ -42,8 +42,7 @@ class Accessor:
         return Option(
             name=name,
             option_name="{prefix}{name}".format(
-                prefix='-' if len(name) <= 1 else '--',
-                name=option_name(name),
+                prefix="-" if len(name) <= 1 else "--", name=option_name(name)
             ),
             required=required,
             type=self.resolver.resolve_type(name),
@@ -53,17 +52,30 @@ class Accessor:
     def create_positional(self, name) -> Option:
         return Option(
             name=name,
-            option_name=option_name(name),
+            option_name=option_name(name).replace("-", "_"),
             required=True,
             type=self.resolver.resolve_type(name),
             default=self.resolver.resolve_default(name),
         )
 
 
+def _getfullargspec(fn):
+    argspec = inspect.getfullargspec(fn)
+    if argspec.annotations is None:
+        return argspec
+
+    # XXX: for `from __future__ import annotations`
+    annotations = t.get_type_hints(fn)
+    assert len(argspec.annotations) == len(annotations)
+    argspec.annotations.update(annotations)
+
+    return argspec
+
+
 class Resolver:
-    def __init__(self, fn):
+    def __init__(self, fn, *, argspec=None):
         self.fn = fn
-        self.argspec = inspect.getfullargspec(fn)
+        self.argspec = argspec or _getfullargspec(fn)
 
     @reify
     def _defaults(self) -> t.Dict[str, t.Any]:

fix positional arguments naming
the conversion that `root_path` -> `root-path`, is invalid
diff --git a/handofcats/tests/test_accessor.py b/handofcats/tests/test_accessor.py
index 7884e35..bf04cde 100644
--- a/handofcats/tests/test_accessor.py
+++ b/handofcats/tests/test_accessor.py
@@ -16,7 +16,7 @@ class Tests(unittest.TestCase):
             self.assertEqual(len(got), 1)
 
             with self.subTest("option_name"):
-                self.assertEqual(got[0].option_name, "user-name")
+                self.assertEqual(got[0].option_name, "user_name")
             with self.subTest("required"):
                 self.assertEqual(got[0].required, True)
             with self.subTest("default"):

pip install -e .[testing]
parse_log_pytest
pytest
pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
-e git+https://github.com/podhmo/handofcats.git@f00666ab7ea989f76b21084502e48adfde173ce3#egg=handofcats
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
prestring==0.9.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: handofcats
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - prestring==0.9.0
prefix: /opt/conda/envs/handofcats

handofcats/tests/test_accessor.py::Tests::test_args
handofcats/tests/test_accessor.py::Tests::test_kwonlyargs handofcats/tests/test_accessor.py::Tests::test_kwonlyargs_with_type_bool handofcats/tests/test_accessor.py::Tests::test_kwonlyargs_with_type_int
examples/variation/01keyword/main.py examples/variation/02future-annotations/_exposed.py examples/variation/02future-annotations/main.py examples/variation/00positional/_exposed.py examples/variation/Makefile examples/variation/00positional/main.py handofcats/accessor.py examples/variation/01keyword/_exposed.py
examples/variation/01keyword/main.py examples/variation/02future-annotations/_exposed.py examples/variation/02future-annotations/main.py examples/variation/00positional/_exposed.py examples/variation/Makefile examples/variation/00positional/main.py handofcats/accessor.py examples/variation/01keyword/_exposed.py