pub use sub_foo::Foo;
pub use self::Bar as Baz;
pub use sub_foo::Boz;
pub use sub_foo::Bort;

pub trait Bar {
    fn bar() -> Self;
}

impl Bar for isize {
    fn bar() -> isize { 84 }
}

pub mod sub_foo {
    pub trait Foo {
        fn foo() -> Self;
    }

    impl Foo for isize {
        fn foo() -> isize { 42 }
    }

    pub struct Boz {
        unused_str: String
    }

    impl Boz {
        pub fn boz(i: isize) -> bool {
            i > 0
        }
    }

    pub enum Bort {
        Bort1,
        Bort2
    }

    impl Bort {
        pub fn bort() -> String {
            "bort()".to_string()
        }
    }
}