1cdef class Base0:
2    pass
3
4cdef class Base(Base0):
5    pass
6
7cdef class Foo(Base):
8   cdef fooit(self):
9       return 42
10
11cdef class Bar(Foo):
12   pass
13
14cdef class Bam(Bar):
15   pass
16
17cdef class Zoo(Bam):
18   pass
19
20
21def fooit(Foo foo):
22    """
23    >>> zoo = Zoo()
24    >>> for cl in (Zoo, Bam, Bar, Foo, Base, Base0): assert isinstance(zoo, cl)
25    >>> fooit(zoo)
26    42
27    >>> bam = Bam()
28    >>> for cl in (Bam, Bar, Foo, Base, Base0): assert isinstance(bam, cl)
29    >>> fooit(bam)
30    42
31    >>> bar = Bar()
32    >>> for cl in (Bar, Foo, Base, Base0): assert isinstance(bar, cl)
33    >>> fooit(bar)
34    42
35    >>> foo = Foo()
36    >>> for cl in (Foo, Base, Base0): assert isinstance(foo, cl)
37    >>> fooit(foo)
38    42
39    >>> base = Base()
40    >>> for cl in (Base, Base0): assert isinstance(base, cl)
41    >>> fooit(base)
42    Traceback (most recent call last):
43    TypeError: Argument 'foo' has incorrect type (expected subclasses.Foo, got subclasses.Base)
44    >>> base0 = Base0()
45    >>> for cl in (Base0,): assert isinstance(base0, cl)
46    >>> fooit(base0)
47    Traceback (most recent call last):
48    TypeError: Argument 'foo' has incorrect type (expected subclasses.Foo, got subclasses.Base0)
49    """
50    return foo.fooit()
51