Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 18 additions & 14 deletions lib/core/facets/module/mattr.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ class Module
# @uncommon
# require 'facets/module/cattr'
#
def cattr(*syms)
def cattr(*syms, &block)
writers, readers = syms.flatten.partition{ |a| a.to_s =~ /=$/ }
writers = writers.map{ |e| e.to_s.chomp('=').to_sym }
##readers.concat( writers ) # writers also get readers

cattr_reader(*readers)
cattr_writer(*writers)
cattr_reader(*readers, &block)
cattr_writer(*writers, &block)

return readers + writers
end
Expand All @@ -49,7 +49,7 @@ def cattr(*syms)
# @uncommon
# require 'facets/module/cattr'
#
def cattr_reader(*syms)
def cattr_reader(*syms, &block)
syms.flatten.each do |sym|
module_eval(<<-EOS, __FILE__, __LINE__)
unless defined? @@#{sym}
Expand All @@ -64,6 +64,7 @@ def #{sym}
@@#{sym}
end
EOS
class_variable_set("@@#{sym}", block.call) if block
end
return syms
end
Expand Down Expand Up @@ -91,7 +92,7 @@ def #{sym}
# @uncommon
# require 'facets/module/cattr'
#
def cattr_writer(*syms)
def cattr_writer(*syms, &block)
syms.flatten.each do |sym|
module_eval(<<-EOS, __FILE__, __LINE__)
unless defined? @@#{sym}
Expand All @@ -106,6 +107,7 @@ def #{sym}=(obj)
@@#{sym}=(obj)
end
EOS
class_variable_set("@@#{sym}", block.call) if block
end
return syms
end
Expand All @@ -130,8 +132,8 @@ def #{sym}=(obj)
# @uncommon
# require 'facets/module/cattr'
#
def cattr_accessor(*syms)
cattr_reader(*syms) + cattr_writer(*syms)
def cattr_accessor(*syms, &block)
cattr_reader(*syms, &block) + cattr_writer(*syms)
end

# Creates a class-variable attribute that can
Expand Down Expand Up @@ -159,13 +161,13 @@ def cattr_accessor(*syms)
# @uncommon
# require 'facets/module/mattr'
#
def mattr(*syms)
def mattr(*syms, &block)
writers, readers = syms.flatten.partition{ |a| a.to_s =~ /=$/ }
writers = writers.collect{ |e| e.to_s.chomp('=').to_sym }
##readers.concat( writers ) # writers also get readers

mattr_writer( *writers )
mattr_reader( *readers )
mattr_writer( *writers, &block )
mattr_reader( *readers, &block )

return readers + writers
end
Expand All @@ -189,7 +191,7 @@ def mattr(*syms)
# @uncommon
# require 'facets/module/mattr'
#
def mattr_reader( *syms )
def mattr_reader( *syms, &block )
syms.flatten.each do |sym|
module_eval(<<-EOS, __FILE__, __LINE__)
unless defined? @@#{sym}
Expand All @@ -204,6 +206,7 @@ def #{sym}
@@#{sym}
end
EOS
class_variable_set("@@#{sym}", block.call) if block
end
return syms
end
Expand Down Expand Up @@ -232,7 +235,7 @@ def #{sym}
# @uncommon
# require 'facets/module/mattr'
#
def mattr_writer(*syms)
def mattr_writer(*syms, &block)
syms.flatten.each do |sym|
module_eval(<<-EOS, __FILE__, __LINE__)
unless defined? @@#{sym}
Expand All @@ -247,6 +250,7 @@ def #{sym}=(obj)
@@#{sym}=(obj)
end
EOS
class_variable_set("@@#{sym}", block.call) if block
end
return syms
end
Expand All @@ -272,8 +276,8 @@ def #{sym}=(obj)
# @uncommon
# require 'facets/module/mattr'
#
def mattr_accessor(*syms)
mattr_reader(*syms) + mattr_writer(*syms)
def mattr_accessor(*syms, &block)
mattr_reader(*syms, &block) + mattr_writer(*syms)
end

end
Expand Down
59 changes: 59 additions & 0 deletions test/core/module/test_mattr.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
covers 'facets/module/mattr'

test_case Module do

method :cattr_reader do

test do
c = Class.new do
cattr_reader(:setting) { :default }
end

c.setting.assert == :default
c.new.setting.assert == :default
end

end

method :cattr_accessor do

test do
c = Class.new do
cattr_accessor(:setting) { :default }
end

c.setting.assert == :default
c.setting = :changed
c.new.setting.assert == :changed
end

end

method :mattr_reader do

test do
c = Class.new do
mattr_reader(:setting) { :default }
end

c.setting.assert == :default
c.new.setting.assert == :default
end

end

method :mattr_accessor do

test do
c = Class.new do
mattr_accessor(:setting) { :default }
end

c.setting.assert == :default
c.setting = :changed
c.new.setting.assert == :changed
end

end

end