mongoid/mongoid — pull request #2588 by mzsanford (2012-11-27 18:17:49+00:00)
Title: Fix "syntax error" with dynamic fields 

While running under JRuby I noticed the following error while setting dynamic fields via `[]`:

```
SyntaxError: (eval):1: syntax error, unexpected tMINUS

def sci-fi=(value)
^
org/jruby/RubyModule.java:2286:in `module_eval'
/usr/local/lib/jruby/gems/gems/activesupport-3.2.8/lib/active_support/core_ext/kernel/singleton_class.rb:11:in `class_eval'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes.rb:214:in `define_dynamic_writer'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes.rb:228:in `method_missing'
org/jruby/RubyBasicObject.java:1704:in `__send__'
org/jruby/RubyKernel.java:2130:in `send'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes/processing.rb:124:in `process_attribute'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes/processing.rb:28:in `process_attributes'
org/jruby/RubyHash.java:1211:in `each_pair'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes/processing.rb:26:in `process_attributes'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes/processing.rb:190:in `with_mass_assignment'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes/processing.rb:187:in `with_mass_assignment'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes/processing.rb:22:in `process_attributes'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes.rb:158:in `assign_attributes'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/threaded/lifecycle.rb:26:in `_assigning'
/usr/local/lib/jruby/gems/gems/mongoid-3.0.10/lib/mongoid/attributes.rb:157:in `assign_attributes'
```

The root cause seems to be the call to `define_dynamic_writer` without verifying that the method name is a valid Ruby identifier. This then calls `class_eval` with invalid syntax. I put a guard in `process_attribute` as well as the `define_dynamic_*` methods as a defense in depth against future errors. The new spec test was added and failing before this change.

Somewhat related, is there any worry about these `class_eval` calls causing bloat over time when using high numbers of dynamic attributes?