 (defn evaluate-body [system body]
   (mapv (partial evaluate system) body))
 
+(defn method-lookup [obj method-name]
+  (get-in obj [:methods method-name]))
+
 (defn ruby-msg [system obj method-name args]
-  (if-let [meth (get-in obj [:methods method-name])]
-    (apply meth system obj args)
+  (if-let [meth (method-lookup obj method-name)]
+    (if (fn? meth)
+      (apply meth system obj args)
+      (evaluate-body system meth))
     (throw (ex-info "Method lookup failed" {:object obj, :method method-name}))))
 
 (defmulti evaluate-one (fn [vars stmt] (first stmt)))

  (let [[_ name] stmt]
    (if-let [var (get @(:variables system) name)]
      var
      (if-let [meth (get @(:methods system) name)]
        (evaluate-body system meth)
        (throw (ex-info "Cannot find variable or method" {:name name}))))))

(defmethod evaluate-one :method-call [system stmt]
  (let [[_ obj method & args] stmt


(defmethod evaluate-one :method-def [system stmt]
  (let [[_ name args & body] stmt]
    (swap! (:variables system) assoc-in ["self" :methods name] body)))

(defn evaluate [system stmt]
  (try
