lib/pagelet_rails/concerns/options.rb
module PageletRails::Concerns::Options
extend ActiveSupport::Concern
included do
include Shared
helper_method :pagelet_options
end
def pagelet_options *args
set_pagelet_options(*args)
opts = self.class.pagelet_options
class_default_opts = opts.fetch('default', {})
class_action_opts = opts.fetch(action_name, {})
instance_default_opts = @pagelet_options.fetch('default', {})
instance_action_opts = @pagelet_options.fetch(action_name, {})
result = {}.with_indifferent_access
.deep_merge!(class_default_opts)
.deep_merge!(class_action_opts)
.deep_merge!(instance_default_opts)
.deep_merge!(instance_action_opts)
OpenStruct.new result
end
module Shared
def set_pagelet_options *args
opts = args.extract_options!
actions = args
actions << 'default' if actions.blank?
@pagelet_options ||= {}.with_indifferent_access
if opts.any?
actions.each do |action|
@pagelet_options.deep_merge! action => opts
end
end
@pagelet_options
end
end
module ClassMethods
include Shared
def pagelet_options *args
set_pagelet_options(*args)
if superclass && superclass.instance_variable_defined?(:@pagelet_options)
parent = superclass.instance_variable_get :@pagelet_options
parent.merge(@pagelet_options)
else
@pagelet_options
end
end
def inherited subklass
existing = subklass.ancestors.reverse.
reduce({}.with_indifferent_access) do |memo, ancestor|
if ancestor.instance_variable_defined?(:@pagelet_options)
memo.deep_merge! ancestor.instance_variable_get :@pagelet_options
end
memo
end
subklass.instance_variable_set(:@pagelet_options, existing)
super
end
end
end