--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2019-2020 Louis-Vincent Boudreault <lv.boudreault95@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import functional
+
+redef class Object
+ fun toto(x: Int): Int
+ do
+ return x + 1
+ end
+end
+
+redef class Int
+ redef fun toto(x) do return x + self
+
+ fun mult_by(x: Int): Int do return x * self
+end
+
+class A
+ fun fun1: String
+ do
+ return "in A::fun1"
+ end
+end
+
+class B
+ super A
+
+ redef fun fun1
+ do
+ return "in B::fun1"
+ end
+end
+
+class Counter
+ var x = 0
+ fun incr do x += 1
+end
+
+class C[E]
+ var x: E
+ redef fun to_s
+ do
+ if x != null then
+ return "x is {x.as(not null)}"
+ end
+ return "x is null"
+ end
+end
+
+var a = new A
+var b: A = new B
+var f1 = &a.fun1
+assert f1.call == "in A::fun1"
+var f2 = &b.fun1
+assert f2.call == "in B::fun1"
+
+var f3 = &10.mult_by
+assert f3.call(10) == 100
+
+var f4 = &f2.call
+assert f4.call == "in B::fun1"
+
+var f5: Fun0[Object] = &f4.call
+assert f5.call == "in B::fun1"
+assert f5.call == "in B::fun1"
+
+assert (&10.toto).call(100) == 110
+assert (&"allo".toto).call(1) == 2
+
+var cnt = new Counter
+var p1 = &cnt.incr
+var ps = [p1,p1,p1,p1,p1]
+
+for p in ps do p.call
+assert cnt.x == 5
+
+var c1 = new C[nullable Object](null)
+var c2 = new C[nullable Int](null)
+
+var f6 = &c1.to_s
+var f7 = &c2.to_s
+
+assert f6.call == "x is null"
+assert f7.call == "x is null"
+
+c1.x = "test"
+c2.x = 100
+
+assert f6.call == "x is test"
+assert f7.call == "x is 100"