def attr(sub, type, at)
      return [] if sub.empty?
      return [] if type.empty?
      return [] if at.empty?
      type = type.downcase 
      
      if @@attr_cache.has_key? sub \
        and @@attr_cache[sub].has_key? type \
        and @@attr_cache[sub][type].has_key? at
          return @@attr_cache[sub][type][at].dup
      end
      
      unless @@attr_cache.has_key? sub
        @@attr_cache[sub] = {}
      end
      
      unless @@attr_cache[sub].has_key? type
        @@attr_cache[sub][type] = {}
      end
      at = at.upcase
      self[sub].each do |s|
        line = '' 
        if type[0..0] =~ /[0-9]/
          if s =~ /\(\s+(?i:#{type})\s+(?:[A-Z]|\))/
            line = s
          end
        else
          if s =~ /NAME\s+\(?.*'(?i:#{type})'.*\)?\s+(?:[A-Z]|\))/
            line = s
          end
        end
        
        
        multi = ''
        case line
          when /#{at}\s+[\)A-Z]/
            @@attr_cache[sub][type][at] = ['TRUE']
            return ['TRUE']
          when /#{at}\s+'(.+?)'/
            @@attr_cache[sub][type][at] = [$1]
            return [$1]
          when /#{at}\s+\((.+?)\)/
            multi = $1
          when /#{at}\s+\(([\w\d\s\.]+)\)/
            multi = $1
          when /#{at}\s+([\w\d\.]+)/
            @@attr_cache[sub][type][at] = [$1]
            return [$1]
        end
        
        
        
        if multi.match(/\$/)
          @@attr_cache[sub][type][at] = multi.split("$").collect{|attr| attr.strip}
          return @@attr_cache[sub][type][at].dup
        elsif not multi.empty?
          @@attr_cache[sub][type][at] = multi.gsub(/'/, '').split(' ').collect{|attr| attr.strip}
          return @@attr_cache[sub][type][at].dup
        end
      end
      @@attr_cache[sub][type][at] = []
      return []
    end