diff --git a/src/bindings/ruby/lib/hammer.rb b/src/bindings/ruby/lib/hammer.rb
index 63ac2c79d305688e4080bc07bf354285fcc964a9..18c693a475179728247e9dcc2bb9b77e66bf4af4 100644
--- a/src/bindings/ruby/lib/hammer.rb
+++ b/src/bindings/ruby/lib/hammer.rb
@@ -40,5 +40,9 @@ parser =
 #    }
 #  }
 #}
+
 $r = parser.parse 'abcdefgh'
+
 p $r[:ast][:data][:seq].elements.map {|e| e[:data][:uint]}
+# or:
+p $r.ast.data.map(&:data)
diff --git a/src/bindings/ruby/lib/hammer/internal.rb b/src/bindings/ruby/lib/hammer/internal.rb
index bceff326c54a8699017a3a9200107336e6627b8a..214145a9053373c75e60a868cde976783fa09530 100644
--- a/src/bindings/ruby/lib/hammer/internal.rb
+++ b/src/bindings/ruby/lib/hammer/internal.rb
@@ -28,6 +28,10 @@ module Hammer
               :arena, :pointer,
               :elements, :pointer # HParsedToken**
 
+      def used
+        self[:used]
+      end
+
       def elements
         elem_array = FFI::Pointer.new(:pointer, self[:elements])
         return (0...self[:used]).map { |i| HParsedToken.new(elem_array[i].read_pointer) }
@@ -43,7 +47,12 @@ module Hammer
         # Should be the same encoding as the string the token was created with.
         # But how do we get to this knowledge at this point?
         # Cheap solution: Just ask the user (additional parameter with default value of UTF-8).
-        return self[:token].read_string(self[:len]).force_encoding('UTF-8')
+        self[:token].read_string(self[:len]).force_encoding('UTF-8')
+      end
+
+      # TODO: Probably should rename this to match ruby conventions: length, count, size
+      def len
+        self[:len]
       end
     end
 
@@ -62,6 +71,37 @@ module Hammer
               :data, HParsedTokenDataUnion.by_value,
               :index, :size_t,
               :bit_offset, :char
+
+      def token_type
+        self[:token_type]
+      end
+
+      # TODO: Is this name ok?
+      def data
+        return self[:data][:bytes].token if token_type == :bytes
+        return self[:data][:sint] if token_type == :sint
+        return self[:data][:uint] if token_type == :uint
+        return self[:data][:seq].elements if token_type == :sequence
+        return self[:data][:user] if token_type == :user
+      end
+
+      def bytes
+        raise ArgumentError, 'wrong token type' unless token_type == :bytes
+        self[:data][:bytes]
+      end
+
+      def seq
+        raise ArgumentError, 'wrong token type' unless token_type == :sequence
+        self[:data][:seq]
+      end
+
+      def index
+        self[:index]
+      end
+
+      def bit_offset
+        self[:bit_offset]
+      end
     end
 
     class HParseResult < FFI::Struct
@@ -69,6 +109,14 @@ module Hammer
               :bit_length, :long_long,
               :arena, :pointer
 
+      def ast
+        self[:ast]
+      end
+
+      def bit_length
+        self[:bit_length]
+      end
+
       def self.release(ptr)
         Hammer::Internal.h_parse_result_free(ptr) unless ptr.null?
       end