diff --git a/lib/atomy/pattern/attribute.rb b/lib/atomy/pattern/attribute.rb
index <HASH>..<HASH> 100644
--- a/lib/atomy/pattern/attribute.rb
+++ b/lib/atomy/pattern/attribute.rb
@@ -14,7 +14,8 @@ class Atomy::Pattern
     end
 
     def assign(scope, val)
-      @receiver.send(:"#{@attribute}=", val)
+      # don't use send; Generator implements #send, other things might too.
+      @receiver.__send__(:"#{@attribute}=", val)
     end
   end
 end
diff --git a/spec/atomy/pattern/attribute_spec.rb b/spec/atomy/pattern/attribute_spec.rb
index <HASH>..<HASH> 100644
--- a/spec/atomy/pattern/attribute_spec.rb
+++ b/spec/atomy/pattern/attribute_spec.rb
@@ -31,5 +31,14 @@ describe Atomy::Pattern::Attribute do
       subject.assign(Rubinius::VariableScope.current, 42)
       expect(receiver.abc).to eq(42)
     end
+
+    context "when the receiver implements #send" do
+      before { allow(receiver).to receive(:send).and_raise("hell") }
+
+      it "still assigns the correct attribute" do
+        subject.assign(Rubinius::VariableScope.current, 42)
+        expect(receiver.abc).to eq(42)
+      end
+    end
   end
 end
attribute pattern uses #__send__, not #send

...because some things override that, which is very confusing (e.g.
CodeTools::Generator)