Sha256: 4c7178da365bebe9c604cdb1e7340c3255f0acf1ba1843b31e8b20930442bdba

Contents?: true

Size: 1.04 KB

Versions: 2

Compression:

Stored size: 1.04 KB

Contents

class Frenetic
  class StructureRegistry
    class Rebuilder
      attr_reader :signatures, :resource

      def initialize(signatures, resource, attributes, key, signature)
        @signatures, @resource, @attributes, @key, @signature = signatures, resource, attributes, key, signature
      end

      def call
        destroy!
        signatures[@key] = @signature
        Struct.new(@key, *@attributes.keys, &structure_instance_methods)
      end

      def destroy!
        return unless exists?
        signatures.delete(@key)
        Struct.send(:remove_const, @key)
      end

      def exists?
        Struct.constants.include?(@key.to_sym)
      end

    private

      def structure_instance_methods
        method_builders = resource.class.ancestors[1..-1].map do |ancestor|
          ancestor.instance_variable_get('@_structure_block')
        end.compact
        _resource = resource
        Proc.new do
          method_builders.each do |builder|
            instance_exec(_resource, &builder)
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
frenetic-3.0.1 lib/frenetic/structure_registry/rebuilder.rb
frenetic-3.0.0 lib/frenetic/structure_registry/rebuilder.rb