def property(*names)
      options = names.pop if names.last.is_a?(Hash)
      names.each do |name|
        name = name.to_sym
        define_method name do
          get_property(name)
        end
        @property_list ||= []
        @property_list << Property.new(name, options)
      end
      nil
    end
def property(*names)
      options = names.pop if names.last.is_a?(Hash)
      names.each do |name|
        name = name.to_sym
        define_method name do
          get_property(name)
        end
        @property_list ||= []
        @property_list << Property.new(name, options)
      end
      nil
    end
Define a property
 @overload property(*names, options={})
   @param [Symbol] names list of property names
   @param [Hash] options the options to use to create the property
   @option options :as (:self) How to build property

     :raw - raw data

     :self - self.new(data)

     class - class.new(data)

     Array(class, :method) - class.method(data)

     lambda - lambda.call(data)
   @option options :from (property name) where to find property value in incomming data hash

     symbol - name

     array - list of nested hash keys
   @option options :to (from value) where to put property value in outgoing incomming data hash

     symbol - name

     array - list of nested hash keys
   @example
    property :value, :from => :input_name
   @example
    property :value2, :value3
   @example
    property :nested_value, :from => [:block, :var]
   @example
    property :other, :as => OtherClass
   @example
    property :processed, :as => lambda { |data| "Processed: #{data}" }, :to => :output_name
   @example
    property :child, :as => OtherPartyClass
   @return [nil]