# File lib/ole/storage/base.rb, line 740
      def initialize ole, values=DEFAULT, params={}
        @ole = ole        
        values, params = DEFAULT, values if Hash === values
        values = values.unpack(PACK) if String === values
        super(*values)

        # extra parsing from the actual struct values
        @name = params[:name] || Types::Variant.load(Types::VT_LPWSTR, name_utf16[0...name_len])
        @type = if params[:type]
          unless TYPE_MAP.values.include?(params[:type])
            raise ArgumentError, "unknown type #{params[:type].inspect}"
          end
          params[:type]
        else
          TYPE_MAP[type_id] or raise FormatError, "unknown type_id #{type_id.inspect}"
        end

        # further extra type specific stuff
        if file?
          default_time = @ole.params[:update_timestamps] ? Types::FileTime.now : nil
          @create_time ||= default_time
          @modify_time ||= default_time
          @create_time = Types::Variant.load(Types::VT_FILETIME, create_time_str) if create_time_str
          @modify_time = Types::Variant.load(Types::VT_FILETIME, create_time_str) if modify_time_str
          @children = nil
          @name_lookup = nil
        else
          @create_time = nil
          @modify_time = nil
          self.size = 0 unless @type == :root
          @children = []
          @name_lookup = {}
        end

        @parent = nil
        
        # to silence warnings. used for tree building at load time
        # only.
        @idx = nil
      end