Sha256: 7bd41b01d30e7e338e5e7534c20c9e8b4ee856164f79f6eb6c155541b4bc593e

Contents?: true

Size: 2 KB

Versions: 3

Compression:

Stored size: 2 KB

Contents

module Slim
  class LogicLess
    # For logic less mode, objects can be encased in the Wrapper class.
    # @api private
    class Wrapper
      attr_reader :value, :parent

      def initialize(value, parent = nil)
        @value, @parent = value, parent
      end

      # To find the reference, first check for standard method
      # access by using respond_to?.
      #
      # If not found, check to see if the value is a hash and if the
      # the name is a key on the hash.
      #
      # Not a hash, or not a key on the hash, then check to see if there
      # is an instance variable with the name.
      #
      # If the instance variable doesn't exist and there is a parent object,
      # go through the same steps on the parent object.  This is useful when
      # you are iterating over objects.
      def [](name)
        return wrap(value.send(name)) if value.respond_to?(name)
        if value.respond_to?(:has_key?)
          return wrap(value[name.to_sym]) if value.has_key?(name.to_sym)
          return wrap(value[name.to_s]) if value.has_key?(name.to_s)
        end
        begin
          var_name = "@#{name}"
          return wrap(value.instance_variable_get(var_name)) if value.instance_variable_defined?(var_name)
        rescue NameError
          # Do nothing
        end
        parent[name] if parent
      end

      # Empty objects must appear empty for inverted sections
      def empty?
        value.respond_to?(:empty) && value.empty?
      end

      # Used for output
      def to_s
        value.to_s
      end

      private

      def wrap(response)
        # Primitives are not wrapped
        if [String, Numeric, TrueClass, FalseClass, NilClass].any? {|primitive| primitive === response }
          response
          # Enumerables are mapped with wrapped values (except Hash-like objects)
        elsif !response.respond_to?(:has_key?) && response.respond_to?(:map)
          response.map {|v| wrap(v) }
        else
          Wrapper.new(response, self)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
slim-1.3.4 lib/slim/logic_less/wrapper.rb
slim-1.3.3 lib/slim/logic_less/wrapper.rb
slim-1.3.2 lib/slim/logic_less/wrapper.rb