lib/reality/facets/facet_container.rb in reality-facets-1.5.0 vs lib/reality/facets/facet_container.rb in reality-facets-1.6.0

- old
+ new

@@ -17,21 +17,33 @@ module FacetContainer def self.extended(base) base.class_eval 'module FacetDefinitions; end' end - def facet?(key) - facet_by_name?(key) + # An array of modules that should be mixed in to every extension object + def facet_extensions + facet_extension_list.dup end - def facet_by_name?(key) - !!facet_map[key.to_s] + # Add a ruby module that will be applied to all extension objects + def facet_extension(extension) + Facets.error("Attempting to define facet extension #{extension} after facet manager is locked") if locked? + facet_extension_list << extension + target_manager.lock! end - def facet_by_name(key) - facet = facet_map[key.to_s] - Facets.error("Unknown facet '#{key}'") unless facet + def facet?(name) + facet_by_name?(name) + end + + def facet_by_name?(name) + !!facet_map[name.to_s] + end + + def facet_by_name(name) + facet = facet_map[name.to_s] + Facets.error("Unknown facet '#{name}'") unless facet facet end def facet(definition, options = {}, &block) Facets.error("Unknown definition form '#{definition.inspect}'") unless (definition.is_a?(Symbol) || (definition.is_a?(Hash) && 1 == definition.size)) @@ -46,10 +58,19 @@ def facets facet_map.values end + def lock! + @locked = true + apply_facet_extensions + end + + def locked? + !!(@locked ||= nil) + end + def target_manager @target_manager ||= Reality::Facets::TargetManager.new(self) end def facet_definitions @@ -71,55 +92,55 @@ end end results end - def activate_facet(object, facet_key) - return if object.facet_enabled?(facet_key) + def activate_facet(object, facet_name) + return if object.facet_enabled?(facet_name) - facet = facet_by_name(facet_key) + facet = facet_by_name(facet_name) facet.required_facets.each do |required_facet_key| activate_facet(object, required_facet_key) end facet.suggested_facets.each do |suggested_facet_key| activate_facet(object, suggested_facet_key) end - object.send(:"_enable_facet_#{facet_key}!") + object.send(:"_enable_facet_#{facet_name}!") each_contained_model_object(object) do |child| - activate_facet(child, facet_key) + activate_facet(child, facet_name) end end - def deactivate_facet(object, facet_key) - return unless object.facet_enabled?(facet_key) + def deactivate_facet(object, facet_name) + return unless object.facet_enabled?(facet_name) each_contained_model_object(object) do |child| - deactivate_facet(child, facet_key) + deactivate_facet(child, facet_name) end facets.each do |facet| - if facet.required_facets.include?(facet_key) + if facet.required_facets.include?(facet_name) deactivate_facet(object, facet.key) end end - object.send(:"_disable_facet_#{facet_key}!") + object.send(:"_disable_facet_#{facet_name}!") end def extension_point(object, action) # noinspection RubyNestedTernaryOperatorsInspection name = object.respond_to?(:qualified_name) ? object.qualified_name : object.respond_to?(:name) ? object.name : object.to_s if object.respond_to?(action, true) Facets.debug "Running '#{action}' hook on #{object.class} #{name}" object.send(action) end - object.enabled_facets.each do |facet_key| + object.enabled_facets.each do |facet_name| # Need to check for the magic facet_X method rather than X method directly as # sometimes there is a global method of the same name. - method_name = "facet_#{facet_key}" + method_name = "facet_#{facet_name}" extension_object = object.respond_to?(method_name) ? object.send(method_name) : nil if extension_object && extension_object.respond_to?(action, true) - Facets.debug "Running '#{action}' hook on #{facet_key} facet of #{object.class} #{name}" + Facets.debug "Running '#{action}' hook on #{facet_name} facet of #{object.class} #{name}" extension_object.send(action) end end each_contained_model_object(object) do |child| extension_point(child, action) @@ -143,11 +164,30 @@ def handle_sub_feature?(object, sub_feature_key) true end + def apply_facet_extensions + facet_extension_list.each do |extension| + facet_map.values.each do |facet| + target_manager.targets.each do |target| + if facet.enhanced?(target.model_class) + facet.enhance(target.model_class) do + include extension + end + end + end + end + end + end + + def facet_extension_list + @facet_extensions ||= [] + end + def register_facet(facet) - target_manager.lock_targets + target_manager.lock! + Facets.error("Attempting to define facet #{facet.key} after facet manager is locked") if locked? Facets.error("Attempting to redefine facet #{facet.key}") if facet_map[facet.key.to_s] facet_map[facet.key.to_s] = facet end # Map a facet key to a map. The map maps types to extension classes