Sha256: 184f92e204286494799f6042f44b336d52f2e3fb954070db55960aafa259347a

Contents?: true

Size: 1 KB

Versions: 2

Compression:

Stored size: 1 KB

Contents

class Frenetic
  module Structured
    # Stores the unique signature of each Resource Structure
    # Used to determine when a Structure has changed and thus
    # needs to be redefined.
    @@signatures = {}

    def struct_key
      "#{self.class}::FreneticResourceStruct".gsub '::', ''
    end

    def signature
      @attrs.keys.sort.join('')
    end

    def structure
      if structure_expired?
        rebuild_structure!
      else
        fetch_structure
      end
    end

    def fetch_structure
      Struct.const_get struct_key
    end

    def rebuild_structure!
      destroy_structure!
      @@signatures[struct_key] = signature
      Struct.new(struct_key, *@attrs.keys)
    end

    def structure_expired?
      @@signatures[struct_key] != signature
    end

    def structure_defined?
      Struct.constants.include? struct_key.to_sym
    end

    def destroy_structure!
      return unless structure_defined?
      @@signatures.delete struct_key
      Struct.send :remove_const, struct_key
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
frenetic-2.0.0 lib/frenetic/concerns/structured.rb
frenetic-1.0.0 lib/frenetic/concerns/structured.rb