Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module JavaScript
- class Object
- def initialize(hash={}, constants=[]) #Put keys into constants that you want to be read only
- @hash,@constants=hash,constants
- end
- def method_missing(name, *args, &block)
- if name.to_s =~ /=$/
- if @constants.include? name.to_s.sub(/=/,'').to_sym
- raise Exception.new "Cannot modify object constant - #{name.to_s.sub(/=/,'')}"
- end
- @hash[name.to_s.sub(/=/,'').to_sym] = ((args==[]) ? ((block.nil?) ? nil : block) : args[0])
- elsif name =~ /^\/(.+?)$/
- method(:"/").call($1.to_sym) #/
- else
- return @hash[name]
- end
- end
- define_singleton_method(:"/") do |args=:elements|
- case args
- when :elements
- return @hash.keys
- when :constants
- return @constants
- else
- return nil
- end
- end
- end
- class Function
- def initialize(&code)
- @code = code
- end
- def [](*args)
- i='a'; string=''
- while(arg = args.shift)
- @temp = {}
- eval "@temp[:#{i}] = arg"
- string << ", @temp[:#{i}]"
- i.next!
- end
- string.sub!(/\,/,'')
- eval "@code.call #{string}"
- @temp = nil
- end
- end
- end
- __END__
- [1] pry(main)> require 'rubyserif'
- => true
- [2] pry(main)> k = JavaScript::Object.new({:foo => 'bar', :constant => 'not easily changed'}, [:constant])
- => #<JavaScript::Object:0x000000024536c8
- @constants=[:constant],
- @hash={:foo=>"bar", :constant=>"not easily changed"}>
- [3] pry(main)> k.foo
- => "bar"
- [4] pry(main)> k.foo = 'foobar'
- => "foobar"
- [5] pry(main)> k.new_element = :hello
- => :hello
- [6] pry(main)> k/:elements
- => [:foo, :constant, :new_element]
- [7] pry(main)> k/:constants
- => [:constant]
- [8] pry(main)> k.constant = 'lol'
- Exception: Cannot modify object constant - constant
- from /var/lib/gems/1.9.1/gems/rubyserif-0.1/lib/rubyserif.rb:11:in `method_missing'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement