class Restforce::Concerns::Picklists::PicklistValues

def controlling_field

def controlling_field
  @_controlling_field ||= fields.find { |f| f['name'] == field['controllerName'] }
end

def controlling_picklist

def controlling_picklist
  @_controlling_picklist ||= controlling_field['picklistValues'].
                             find do |picklist_entry|
                               picklist_entry['value'] == @valid_for
                             end
end

def dependent?

Returns true of the given field is dependent on another field.
def dependent?
  !!field['dependentPicklist']
end

def field

def field
  @_field ||= fields.find { |f| f['name'] == @field }
end

def index

def index
  @_index ||= controlling_field['picklistValues'].index(controlling_picklist)
end

def initialize(fields, field, options = {})

def initialize(fields, field, options = {})
  @fields = fields
  @field = field
  @valid_for = options.delete(:valid_for)
  raise "#{field} is not a dependent picklist" if @valid_for && !dependent?
  replace(picklist_values)
end

def picklist_values

def picklist_values
  if valid_for?
    field['picklistValues'].select { |picklist_entry| valid? picklist_entry }
  else
    field['picklistValues']
  end
end

def valid?(picklist_entry)

cribesobjects_describesobjectresult.htm
See http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_des

Returns true if the picklist entry is valid for the controlling picklist.
def valid?(picklist_entry)
  valid_for = picklist_entry['validFor'].ljust(16, 'A').unpack('m').first.
              unpack('C*')
  (valid_for[index >> 3] & (0x80 >> index % 8)).positive?
end

def valid_for?

def valid_for?
  !!@valid_for
end