Sha256: 59cef9527096f1d8926542ffed8bec4ba2ff5280f0ddb60d263627123ad3b687

Contents?: true

Size: 1.79 KB

Versions: 22

Compression:

Stored size: 1.79 KB

Contents

# encoding: utf-8

require_relative 'object'

module Epuber
  module DSL
    class TreeObject < Object
      # @param [TreeObject] parent
      #
      def initialize(parent = nil)
        super()

        @parent      = parent
        @sub_items = []

        parent.sub_items << self unless parent.nil?
      end

      # @return nil
      #
      def freeze
        super
        @sub_items.freeze
      end

      # @return [self] reference to parent
      #
      attr_reader :parent

      # @return [Array<self>] child items
      #
      attr_reader :sub_items

      # @return [Array<self>] child items
      #
      def flat_sub_items
        all = []

        sub_items.each do |item|
          all << item
          all.concat(item.flat_sub_items)
        end

        all
      end

      # @return [Bool] receiver is root
      #
      def root?
        @parent.nil?
      end

      # @return nil
      #
      def validate
        super
        sub_items.each(&:validate)
      end

      class << self
        # @return [Self]
        #
        attr_accessor :current_parent_object
      end

      # @yield [child_item]
      # @yieldparam child_item [self] created child item
      #
      # @return [self]
      #
      def create_child_item(*args)
        child = self.class.new(*args)

        parent_object_before = self.class.current_parent_object

        child.parent = parent_object_before || self
        child.parent.sub_items << child

        self.class.current_parent_object = child
        yield child if block_given?


        self.class.current_parent_object = parent_object_before

        child
      end

      # @return nil
      #
      def create_child_items
        yield self if block_given?
      end


      protected

      attr_writer :parent
      attr_writer :sub_items
    end
  end
end

Version data entries

22 entries across 22 versions & 1 rubygems

Version Path
epuber-0.6.0 lib/epuber/dsl/tree_object.rb
epuber-0.5.7 lib/epuber/dsl/tree_object.rb
epuber-0.5.6 lib/epuber/dsl/tree_object.rb
epuber-0.5.5 lib/epuber/dsl/tree_object.rb
epuber-0.5.4 lib/epuber/dsl/tree_object.rb
epuber-0.5.3 lib/epuber/dsl/tree_object.rb
epuber-0.5.2 lib/epuber/dsl/tree_object.rb
epuber-0.5.1 lib/epuber/dsl/tree_object.rb
epuber-0.5.0 lib/epuber/dsl/tree_object.rb
epuber-0.5.0.beta.5 lib/epuber/dsl/tree_object.rb
epuber-0.5.0.beta.4 lib/epuber/dsl/tree_object.rb
epuber-0.5.0.beta.3 lib/epuber/dsl/tree_object.rb
epuber-0.5.0.beta.2 lib/epuber/dsl/tree_object.rb
epuber-0.5.0.beta lib/epuber/dsl/tree_object.rb
epuber-0.4.0 lib/epuber/dsl/tree_object.rb
epuber-0.3.12 lib/epuber/dsl/tree_object.rb
epuber-0.3.11 lib/epuber/dsl/tree_object.rb
epuber-0.3.10 lib/epuber/dsl/tree_object.rb
epuber-0.3.9 lib/epuber/dsl/tree_object.rb
epuber-0.3.7 lib/epuber/dsl/tree_object.rb