at function for objects
diff --git a/README.md b/README.md
index 3359e8f..92e45ad 100644
--- a/README.md
+++ b/README.md
@@ -245,6 +245,9 @@
 render("Hello {{ default(neighbour, \"my friend\") }}!", data); // "Hello Peter!"
 render("Hello {{ default(colleague, \"my friend\") }}!", data); // "Hello my friend!"
 
+// Access an objects value dynamically
+render("{{ at(time, \"start\") }} to {{ time.end }}", data); // "16 to 22"
+
 // Check if a key exists in an object
 render("{{ exists(\"guests\") }}", data); // "true"
 render("{{ exists(\"city\") }}", data); // "false"
diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp
index af774b2..d33cb46 100644
--- a/include/inja/renderer.hpp
+++ b/include/inja/renderer.hpp
@@ -343,7 +343,11 @@
     } break;
     case Op::At: {
       const auto args = get_arguments<2>(node);
-      json_eval_stack.push(&args[0]->at(args[1]->get<int>()));
+      if (args[0]->is_object()) {
+        json_eval_stack.push(&args[0]->at(args[1]->get<std::string>()));
+      } else {
+        json_eval_stack.push(&args[0]->at(args[1]->get<int>()));
+      }
     } break;
     case Op::Default: {
       const auto test_arg = get_arguments<1, 0, false>(node)[0];
diff --git a/test/test-functions.cpp b/test/test-functions.cpp
index 0ddcbf0..e920ff2 100644
--- a/test/test-functions.cpp
+++ b/test/test-functions.cpp
@@ -70,6 +70,8 @@
   SUBCASE("at") {
     CHECK(env.render("{{ at(names, 0) }}", data) == "Jeff");
     CHECK(env.render("{{ at(names, i) }}", data) == "Seb");
+    CHECK(env.render("{{ at(brother, \"name\") }}", data) == "Chris");
+    CHECK(env.render("{{ at(at(brother, \"daughters\"), 0) }}", data) == "Maria");
     // CHECK(env.render("{{ at(names, 45) }}", data) == "Jeff");
   }