Sha256: 37cc6a21e540b4d9459710941488fef95545217b1c7c791e5035537537e87243

Contents?: true

Size: 1.37 KB

Versions: 16

Compression:

Stored size: 1.37 KB

Contents

module Sequel
  module Plugins
    # The Subclasses plugin keeps track of all subclasses of the
    # current model class.  Direct subclasses are available via the
    # subclasses method, and all descendent classes are available via the
    # descendents method.
    #
    #   c = Class.new(Sequel::Model)
    #   c.plugin :subclasses
    #   sc1 = Class.new(c)
    #   sc2 = Class.new(c)
    #   ssc1 = Class.new(sc1)
    #   c.subclasses    # [sc1, sc2]
    #   sc1.subclasses  # [ssc1]
    #   sc2.subclasses  # []
    #   ssc1.subclasses # []
    #   c.descendents   # [sc1, ssc1, sc2]
    module Subclasses
      # Initialize the subclasses instance variable for the model.
      def self.apply(model, &block)
        model.instance_variable_set(:@subclasses, [])
      end

      module ClassMethods
        # All subclasses for the current model.  Does not
        # include the model itself.
        attr_reader :subclasses

        # All descendent classes of this model.
        def descendents
          subclasses.map{|x| [x] + x.descendents}.flatten
        end

        # Add the subclass to this model's current subclasses,
        # and initialize a new subclasses instance variable
        # in the subclass.
        def inherited(subclass)
          super
          subclasses << subclass
          subclass.instance_variable_set(:@subclasses, [])
        end
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 2 rubygems

Version Path
sequel-3.18.0 lib/sequel/plugins/subclasses.rb
sequel-3.17.0 lib/sequel/plugins/subclasses.rb
sequel-3.16.0 lib/sequel/plugins/subclasses.rb
sequel-3.15.0 lib/sequel/plugins/subclasses.rb
sequel-3.14.0 lib/sequel/plugins/subclasses.rb
sequel-3.13.0 lib/sequel/plugins/subclasses.rb
sequel-3.12.1 lib/sequel/plugins/subclasses.rb
sequel-3.12.0 lib/sequel/plugins/subclasses.rb
sequel-3.11.0 lib/sequel/plugins/subclasses.rb
viking-sequel-3.10.0 lib/sequel/plugins/subclasses.rb
sequel-3.10.0 lib/sequel/plugins/subclasses.rb
sequel-3.9.0 lib/sequel/plugins/subclasses.rb
sequel-3.8.0 lib/sequel/plugins/subclasses.rb
sequel-3.7.0 lib/sequel/plugins/subclasses.rb
sequel-3.6.0 lib/sequel/plugins/subclasses.rb
sequel-3.5.0 lib/sequel/plugins/subclasses.rb