diff --git a/dataclass_cli/__init__.py b/dataclass_cli/__init__.py
index 55577c1..5e7425b 100644
--- a/dataclass_cli/__init__.py
+++ b/dataclass_cli/__init__.py
@@ -1,1 +1,1 @@
-from dataclass_cli.parser import add
+from dataclass_cli.parser import Options, add
diff --git a/dataclass_cli/parser.py b/dataclass_cli/parser.py
index e58f7a4..4ae8182 100644
--- a/dataclass_cli/parser.py
+++ b/dataclass_cli/parser.py
@@ -1,8 +1,14 @@
 import argparse
 import dataclasses
+import enum
 from typing import Dict, List, Union
 
 
+class Options(str, enum.Enum):
+    POSSIBLE_VALUES = enum.auto()
+    HELP_TEXT = enum.auto()
+
+
 def add(
     cls,
     *,
@@ -11,13 +17,19 @@ def add(
     _parser=argparse.ArgumentParser(),
 ):
     assert dataclasses.is_dataclass(cls)
+
     name = cls.__name__.lower()
     assert name not in _classes
     _classes[name] = [arg.name for arg in dataclasses.fields(cls)]
+
     group = _parser.add_argument_group(name)
     for field in dataclasses.fields(cls):
         group.add_argument(
-            f"--{name}_{field.name}", type=field.type, default=field.default,
+            f"--{name}_{field.name}",
+            type=field.type,
+            default=field.default,
+            choices=field.metadata.get(Options.POSSIBLE_VALUES, None),
+            help=field.metadata.get(Options.HELP_TEXT, None),
         )
 
     original_init = cls.__init__

Ability to add help messages and choices
diff --git a/tests/test_dc_cli.py b/tests/test_dc_cli.py
index 5ec6b1c..e3d51ca 100644
--- a/tests/test_dc_cli.py
+++ b/tests/test_dc_cli.py
@@ -1,7 +1,8 @@
 import argparse
 import unittest
-from dataclasses import dataclass
+from dataclasses import dataclass, field
 from functools import partial
+from io import StringIO
 from unittest import mock
 
 import dataclass_cli
@@ -64,3 +65,57 @@ class TestDcCli(unittest.TestCase):
             parsed_dc = Dataclass2()
             self.assertEqual(parsed_dc.name, name2)
             self.assertEqual(parsed_dc.number, number2)
+
+    def test_no_possible_value_option(self):
+        possible_values = [1, 2, 3]
+
+        @self.add
+        @dataclass
+        class DataclassWithChoices:
+            number: int = field(
+                default=1,
+                metadata={dataclass_cli.Options.POSSIBLE_VALUES: possible_values},
+            )
+
+        number = 0
+        testargs = f"test.py --dataclasswithchoices_number {number}".split()
+        with mock.patch("sys.argv", testargs), self.assertRaises(
+            SystemExit
+        ), mock.patch("sys.stderr", new=StringIO()) as fake_out:
+            _ = DataclassWithChoices()
+        self.assertIn("invalid choice", fake_out.getvalue())
+
+    def test_possible_value_option(self):
+        possible_values = [1, 2, 3]
+
+        @self.add
+        @dataclass
+        class DataclassWithChoices:
+            number: int = field(
+                default=1,
+                metadata={dataclass_cli.Options.POSSIBLE_VALUES: possible_values},
+            )
+
+        number = possible_values[0]
+        testargs = f"test.py --dataclasswithchoices_number {number}".split()
+        with mock.patch("sys.argv", testargs):
+            parsed_dc = DataclassWithChoices()
+        self.assertEqual(parsed_dc.number, number)
+
+    def test_help_text(self):
+        help_text = "This is a help message!"
+
+        @self.add
+        @dataclass
+        class DataclassWithHelp:
+            number: int = field(
+                default=1, metadata={dataclass_cli.Options.HELP_TEXT: help_text},
+            )
+
+        testargs = f"test.py -h".split()
+        with mock.patch("sys.argv", testargs), self.assertRaises(
+            SystemExit
+        ), mock.patch("sys.stdout", new=StringIO()) as fake_out:
+            _ = DataclassWithHelp()
+
+        self.assertIn(help_text, fake_out.getvalue())

pip install -e .
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/malte-soe/dataclass-cli.git@78aa811ec0f7605985dc3a872e5de6f1f7f0363f#egg=dc_cli
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: dataclass-cli
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
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/dataclass-cli

tests/test_dc_cli.py::TestDcCli::test_help_text tests/test_dc_cli.py::TestDcCli::test_no_possible_value_option tests/test_dc_cli.py::TestDcCli::test_possible_value_option
tests/test_dc_cli.py::TestDcCli::test_multiple_dataclass_parsing tests/test_dc_cli.py::TestDcCli::test_single_dataclass_parsing
dataclass_cli/parser.py dataclass_cli/__init__.py
dataclass_cli/parser.py dataclass_cli/__init__.py