Last active
October 25, 2017 21:33
-
-
Save prodis/077e2c8de166090cd939e9db8f92e5d0 to your computer and use it in GitHub Desktop.
Revisions
-
prodis revised this gist
Oct 25, 2017 . 1 changed file with 1 addition and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -59,6 +59,7 @@ def do_something # instance variables: @accessor_attributes @reader_attributes akira = Akira.new(one: 1, two: 2) # => #<Akira:0x007ff1da152e48 @one=1, @two=2> ls akira # Akira#methods: do_something one two two= -
prodis revised this gist
Oct 25, 2017 . No changes.There are no files selected for viewing
-
prodis created this gist
Oct 25, 2017 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,68 @@ module InitAttributes def self.included(base) base.send(:include, InstanceMethods) base.extend(ClassMethods) end module InstanceMethods def initialize(attributes) init_instance_variables(self.class.accessor_attributes, attributes) init_instance_variables(self.class.reader_attributes, attributes) end private def init_instance_variables(required_attributes, given_attributes) required_attributes.each do |attr| instance_variable_set("@#{attr}", given_attributes.fetch(attr)) end end end module ClassMethods def accessor_attributes @accessor_attributes ||= [] end def reader_attributes @reader_attributes ||= [] end private def init_attr_accessor(*attributes) attr_accessor(*attributes) @accessor_attributes = attributes end def init_attr_reader(*attributes) attr_reader(*attributes) @reader_attributes = attributes end end end class Akira include InitAttributes init_attr_reader :one init_attr_accessor :two def do_something puts 'Doing something...' end end ls Akira # InitAttributes::ClassMethods#methods: accessor_attributes reader_attributes # Akira#methods: do_something one two two= # instance variables: @accessor_attributes @reader_attributes akira = Akira.new(one: 1, two: 2) ls akira # Akira#methods: do_something one two two= # instance variables: @one @two Akira.new(one: 1) # => KeyError: key not found: :two