lib/neo/rails/exposure.rb in neo-rails-0.1.3 vs lib/neo/rails/exposure.rb in neo-rails-0.2.0

- old
+ new

@@ -1,28 +1,39 @@ require 'active_support/concern' +require 'neo/rails/exposure/exposures' module Neo module Rails # A really simple version of exposing variables to the view. # Bases on attr_reader and helper_method. module Exposure extend ActiveSupport::Concern - class UndeclaredVariableError < StandardError; end - included do - class_attribute :exposed_vars - self.exposed_vars ||= Set.new + class_attribute :exposure_names + self.exposure_names ||= Set.new end + def exposures + @exposures ||= Exposures.new(self.class.exposure_names) + end + module ClassMethods # Defines the variables to be exposed. def exposes(*names) - exposures = names.map(&:to_sym) - self.exposed_vars.merge exposures - attr_reader *exposures - helper_method *exposures + exposure_names = names.map(&:to_sym) + self.exposure_names.merge exposure_names + + # Define a helper method for each exposure + exposure_names.each do |exposure_name| + # see Rails: /actionpack/lib/abstract_controller/helpers.rb + helper do + define_method exposure_name do + controller.exposures[exposure_name] + end + end + end end end # Expose an assign at the instance level. # @@ -30,20 +41,17 @@ # if a value was not set yet. # # Raise UndeclaredVariableError if access variable wasn't declared before. def expose(key, value=nil) name = key.to_sym - raise UndeclaredVariableError unless self.class.exposed_vars.include?(name) - value = yield if block_given? - - self.instance_variable_set("@#{name}", value) + self.exposures[key] = value end private - def exposed?(name) - instance_variable_defined?("@#{name}") + def exposed?(key) + self.exposures.exposed?(key) end end end end