class SuperStack::Manager
Constants
- DEFAULT_MERGE_POLICY
- DEFAULT_PRIORITY_INTERVAL
Attributes
layers[R]
write_layer[R]
Public Class Methods
new()
click to toggle source
# File lib/super_stack/manager.rb, line 13 def initialize self.extend SuperStack::Compatibility::Manager if SuperStack.compatibility_mode @layers = {} self.default_merge_policy = DEFAULT_MERGE_POLICY end
Public Instance Methods
<<(layer)
click to toggle source
# File lib/super_stack/manager.rb, line 104 def <<(layer) add_layer layer end
[](filter=nil)
click to toggle source
# File lib/super_stack/manager.rb, line 31 def [](filter=nil) layers = to_a return [] if layers.empty? layers.each { |layer| layer.reload if layer.source_auto_reload?} first_layer = layers.shift first_layer = first_layer.disabled? ? SuperStack::Layer.new : first_layer res = layers.inject(first_layer) do |stack, layer| if layer.disabled? stack else policy_to_apply = layer.merge_policy.nil? ? default_merge_policy : layer.merge_policy policy_to_apply.merge stack, layer end end if filter.nil? res.to_hash else res[filter] end end
[]=(key,value)
click to toggle source
# File lib/super_stack/manager.rb, line 26 def []=(key,value) raise 'No write layer specified' if write_layer.nil? write_layer[key] = value end
add_layer(layer)
click to toggle source
# File lib/super_stack/manager.rb, line 60 def add_layer(layer) if layer.is_a? Hash and not layer.class.included_modules.include? SuperStack::LayerWrapper SuperStack::LayerWrapper.from_hash layer end set_valid_name_for layer if layers.keys.include? layer.name layer.priority = get_unused_priority if layer.priority.nil? raise 'This layer already belongs to a manager' unless layer.manager.nil? layers[layer.name] = layer layer.instance_variable_set :@manager, self layer.managed if layer.respond_to? :managed end
clear_layers()
click to toggle source
# File lib/super_stack/manager.rb, line 80 def clear_layers layers.values.each do |layer| layer_name = layer.name @write_layer = nil if layer == write_layer layer.instance_variable_set :@manager, nil end layers.clear end
disable_layer(layer_or_layer_name)
click to toggle source
# File lib/super_stack/manager.rb, line 89 def disable_layer(layer_or_layer_name) layer = get_existing_layer layer_or_layer_name, 'Cannot disable unmanaged layer' if layer == write_layer @previous_write_layer = write_layer @write_layer = nil end layer.instance_variable_set :@disabled, true end
enable_layer(layer_or_layer_name)
click to toggle source
# File lib/super_stack/manager.rb, line 98 def enable_layer(layer_or_layer_name) layer = get_existing_layer layer_or_layer_name, 'Cannot enable unmanaged layer' layer.instance_variable_set :@disabled, false @write_layer = @previous_write_layer if layer == @previous_write_layer end
reload_layers()
click to toggle source
# File lib/super_stack/manager.rb, line 108 def reload_layers layers.values.each &:reload end
remove_layer(layer_or_layer_name)
click to toggle source
# File lib/super_stack/manager.rb, line 72 def remove_layer(layer_or_layer_name) layer = get_existing_layer layer_or_layer_name, 'Cannot remove unmanaged layer' layer_name = layer.name @write_layer = nil if layer == write_layer layer.instance_variable_set :@manager, nil layers.delete layer_name end
reset()
click to toggle source
# File lib/super_stack/manager.rb, line 56 def reset write_layer.clear unless write_layer.nil? end
to_a()
click to toggle source
# File lib/super_stack/manager.rb, line 52 def to_a layers.values.sort end
write_layer=(layer_or_layer_name)
click to toggle source
# File lib/super_stack/manager.rb, line 19 def write_layer=(layer_or_layer_name) layer = get_existing_layer layer_or_layer_name, 'Invalid write layer specified' raise 'Cannot use a disabled layer as write layer' if layer.disabled? @previous_write_layer = nil @write_layer = layer end
Private Instance Methods
get_existing_layer(layer_or_layer_name, error_message)
click to toggle source
# File lib/super_stack/manager.rb, line 115 def get_existing_layer(layer_or_layer_name, error_message) layer_name = layer_or_layer_name.to_s if layer_or_layer_name.is_a? Symbol layer_name = layer_or_layer_name if layer_or_layer_name.is_a? String layer = layers[layer_name] unless layer_name.nil? layer = layer_or_layer_name if layer_or_layer_name.class.included_modules.include? SuperStack::LayerWrapper raise error_message if layer.nil? layer end
get_unused_priority()
click to toggle source
# File lib/super_stack/manager.rb, line 124 def get_unused_priority ordered = self.to_a return DEFAULT_PRIORITY_INTERVAL if ordered.empty? ordered.last.priority + DEFAULT_PRIORITY_INTERVAL end
set_valid_name_for(layer)
click to toggle source
# File lib/super_stack/manager.rb, line 130 def set_valid_name_for(layer) name_pattern = /^(?<layer_name>.+) #(?<number>\d+)\s*$/ while layers.keys.include? layer.name layer.name = "#{layer.name} #1" unless layer.name =~ name_pattern layer.name.match(name_pattern) do |md| layer.name = "#{md[:layer_name]} ##{md[:number].to_i + 1}" next end end layer.name end