Class Methods
module MyEnumerable
def my_first
end
module ClassMethods
def my_new
end
end
def self.included(klass)
klass.extend ClassMethods
end
end
Slide 31
Slide 31 text
Including
class Aaron
include MyEnumerable
end
p Aaron.respond_to?(:my_new) # => true
p Aaron.new.respond_to?(:my_first) # => true
Slide 32
Slide 32 text
With Concern
module MyEnumerable
extend ActiveSupport::Concern
def my_first
end
module ClassMethods
def my_new
end
end
end
Slide 33
Slide 33 text
Including
class Aaron
include MyEnumerable
end
p Aaron.respond_to?(:my_new) # => true
p Aaron.new.respond_to?(:my_first) # => true
Slide 34
Slide 34 text
Be Careful!
Slide 35
Slide 35 text
Normal Include
module MyEnumerable
def my_first
end
end
class Aaron
p singleton_methods # => []
include MyEnumerable
p singleton_methods # => []
end
Slide 36
Slide 36 text
Normal Extend
module MyEnumerable
def my_first
end
end
class Aaron
p singleton_methods # => []
extend MyEnumerable
p singleton_methods # => [:my_first]
end
Slide 37
Slide 37 text
Users May Be
Surprised
Slide 38
Slide 38 text
Do I need this?
Slide 39
Slide 39 text
Are you coupled?
Slide 40
Slide 40 text
Change Your Self.
Slide 41
Slide 41 text
Setting up ivars
Slide 42
Slide 42 text
Class Accessor
module MyEnumerable
module ClassMethods
attr_accessor :foo
end
def self.included klass
klass.extend ClassMethods
end
end
Slide 43
Slide 43 text
Warning!
class Aaron
include MyEnumerable
p foo
end
Slide 44
Slide 44 text
Warning!
class Aaron
include MyEnumerable
p foo
end
@foo not initialized
Slide 45
Slide 45 text
Class Accessor
module MyEnumerable
module ClassMethods
attr_accessor :foo
end
def self.included klass
klass.extend ClassMethods
@foo = 10
end
end
Slide 46
Slide 46 text
Class Accessor
module MyEnumerable
module ClassMethods
attr_accessor :foo
end
def self.included klass
klass.extend ClassMethods
@foo = 10
end
end
self == MyEnumerable
Slide 47
Slide 47 text
Class Accessor
module MyEnumerable
module ClassMethods
attr_accessor :foo
end
def self.included klass
klass.extend ClassMethods
klass.class_eval do
@foo = 10
end
end
end
Slide 48
Slide 48 text
Working Code
class Aaron
include MyEnumerable
p foo # => 10
end
Slide 49
Slide 49 text
With Concern
module MyEnumerable
extend ActiveSupport::Concern
module ClassMethods
attr_accessor :foo
end
included do
@foo = 10
end
end
self ==
included class
Slide 50
Slide 50 text
Isolating Setup
Slide 51
Slide 51 text
Class Method Calls
class Foo < ActiveRecord::Base
scope :foo, -> { ... }
scope :bar, -> { ... }
scope :baz, -> { ... }
# other methods
end