diff --git a/lib/odf-report/field.rb b/lib/odf-report/field.rb
index <HASH>..<HASH> 100644
--- a/lib/odf-report/field.rb
+++ b/lib/odf-report/field.rb
@@ -6,15 +6,15 @@ class Field
 
   def initialize(opts, &block)
     @name = opts[:name]
+    @data_field = opts[:data_field]
 
     unless @value = opts[:value]
 
-      if data_field = opts[:data_field]
-        @block = lambda { |item| item.send(data_field)}
-      elsif block_given?
+      if block_given?
         @block = block
+
       else
-        @block = lambda { |item| item.send(@name)}
+        @block = lambda { |item| self.extract_value(item) }
       end
 
     end
@@ -36,6 +36,22 @@ class Field
     end
   end
 
+  def extract_value(data_item)
+    key = @data_field || @name
+
+    if data_item.is_a?(Hash)
+      data_item[key] || data_item[key.to_s.downcase] || data_item[key.to_s.upcase] || data_item[key.to_s.downcase.to_sym]
+
+    elsif data_item.respond_to?(key.to_s.downcase.to_sym)
+      data_item.send(key.to_s.downcase.to_sym)
+
+    else
+      raise "Can't find field [#{key}] in this #{data_item.class}"
+
+    end
+
+  end
+
 end
 
 end
\ No newline at end of file
flexibilize data structures ODFReport can handle

now you can pass objects & hashes