# Define the DSL methods module Phenomenal::DSL #Override included hook method def self.included(klass) klass.class_eval do # Define context with adaptations def phen_context(context,*contexts,&block) Phenomenal::Context.create(false,nil,context,*contexts,&block) end Phenomenal::DSL.phen_alias(:context,klass) # Define context with adaptations def phen_feature(context,*contexts,&block) Phenomenal::Feature.create(false,nil,context,*contexts,&block) end Phenomenal::DSL.phen_alias(:feature,klass) # Forget Context def phen_forget_context(context) Phenomenal::Manager.instance.find_context(context).forget end # Add adaptation def phen_add_adaptation(context,klass, method_name, &implementation) Phenomenal::Manager.instance.find_context(context).add_adaptation( klass, method_name,true, &implementation ) end def phen_add_class_adaptation(context,klass, method_name, &implementation) Phenomenal::Manager.instance.find_context(context).add_adaptation( klass, method_name,false, &implementation ) end # Remove Adaptation def phen_remove_adaptation(context,klass,method_name) Phenomenal::Manager.instance.find_context(context).remove_adaptation( klass,method_name,true ) end def phen_remove_class_adaptation(context,klass,method_name) Phenomenal::Manager.instance.find_context(context).remove_adaptation( klass,method_name,false ) end # Activate Context def phen_activate_context(context,*contexts) Phenomenal::DSL.phen_switch_context_state(true,context,*contexts) end Phenomenal::DSL.phen_alias(:activate_context,klass) # Deactivate Context def phen_deactivate_context(context,*contexts) Phenomenal::DSL.phen_switch_context_state(false,context,*contexts) end Phenomenal::DSL.phen_alias(:deactivate_context,klass) # Context is active? def phen_context_active?(context) Phenomenal::Manager.instance.find_context(context).active? end # Context informations def phen_context_information(context) Phenomenal::Manager.instance.find_context(context).information end # Default Feature def phen_default_feature Phenomenal::Manager.instance.default_feature end # Defined context registered in the manager def phen_defined_contexts Phenomenal::Manager.instance.contexts.values end # Proceed def phen_proceed(*args,&block) Phenomenal::Manager.instance.proceed(caller,self,*args,&block) end Phenomenal::DSL.phen_alias(:proceed,klass) # Change conflict resolution policy (for the proceed call) def phen_change_conflict_policy(&block) Phenomenal::Manager.instance.change_conflict_policy(&block) end end # Add relationships specific DSL define_relationships(klass) # Add Viewers specific DSL define_viewers(klass) end private def self.phen_switch_context_state(activate,context,*contexts) contexts=[] if contexts.nil? contexts.push(context) contexts.each do |c| if activate Phenomenal::Manager.instance.find_context(c).activate else Phenomenal::Manager.instance.find_context(c).deactivate end end end def self.phen_alias(method,klass) if Kernel.respond_to? method raise(Phenomenal::Error, "The Phenomenal DSL keyword #{method} wasn't defined, use"+ " phen_#{method} instead" ) else klass.class_eval do alias_method method, "phen_#{method}" end end end end #Load the phenomenal primitives as top level methods module Kernel include Phenomenal::DSL end