class AWS::EC2::SecurityGroup

def parse_sources sources

def parse_sources sources
  ips = []
  groups = []
  sources.each do |source|
    case source
    when String
      ips << { :cidr_ip => source }
    when SecurityGroup
      groups << { :group_id => source.id, :user_id => source.owner_id }
    when ELB::LoadBalancer 
      groups << source.source_security_group
    when Hash
      
      # group name or id required
      unless source.has_key?(:group_id) or source.has_key?(:group_name)
        raise ArgumentError, 'invalid ip permission hash, ' +
          'must provide :group_id or :group_name'
      end
      # prevent typos
      unless source.keys - [:group_id, :group_name, :user_id] == []
        raise ArgumentError, 'invalid ip permission hash, ' +
          'only accepts the following keys, :group_id, :group_name, :user_id'
      end
      groups << source
    else
      raise ArgumentError, 'invalid ingress ip permission, ' +
        'expected CIDR IP address or SecurityGroup'
    end
  end
  ips << { :cidr_ip => '0.0.0.0/0' } if ips.empty? and groups.empty?
  [ips, groups]
  
end