class JSONAPI::Serializer

def self.build_jsonapi_object

def self.build_jsonapi_object
  obj = { version: JSONAPI_VERSION }
  obj[:meta] = JSONAPI.configuration.jsonapi_meta if JSONAPI.configuration.jsonapi_meta
  obj
end

def self.jsonapi_object

def self.jsonapi_object
  @jsonapi_object ||= build_jsonapi_object.freeze
end

def self.reset_jsonapi_object!

def self.reset_jsonapi_object!
  @jsonapi_object = nil
end

def base_definition

def base_definition
  @base_definition ||= definition
end

def initialize(record, definition: nil, base_definition: nil, parent_record: nil, association_name: nil)

def initialize(record, definition: nil, base_definition: nil, parent_record: nil, association_name: nil)
  @record = record
  @definition = definition || ResourceLoader.find_for_model(record.class)
  @base_definition = base_definition
  @parent_record = parent_record
  @association_name = association_name
  @sti_subclass = nil
end

def jsonapi_object

def jsonapi_object
  self.class.jsonapi_object
end

def record_id

def record_id
  record.id.to_s
end

def record_type

def record_type
  if definition.name.end_with?("Resource")
    RelationshipHelpers.resource_type_name(definition)
  else
    record.class.name.underscore.pluralize
  end
end

def serialize_record(fields = {}, requested_relationships: nil)

def serialize_record(fields = {}, requested_relationships: nil)
  {
    type: record_type,
    id: record_id,
    attributes: serialize_attributes(fields),
    relationships: serialize_relationships(requested_relationships),
    links: serialize_links,
    meta: record_meta,
  }.compact
end

def to_hash(include: [], fields: {}, document_meta: nil)

def to_hash(include: [], fields: {}, document_meta: nil)
  include_paths = normalize_include_paths(include)
  top_level_relationships = include_paths_to_relationship_names(include_paths, "")
  {
    jsonapi: jsonapi_object,
    data: serialize_record(fields, requested_relationships: top_level_relationships),
    included: serialize_included(include_paths, fields),
    meta: document_meta,
  }.compact
end