%module smart_pointer_extend

%warnfilter(801) hi::CBase::z;	/* Ruby, wrong const name */

%inline %{
  namespace hi
  {
    struct CBase
    {
      static int hello() 
      {
	return 1;
      }
      int x;
      static const int z = 1;
    };

    class CDerived : public CBase
    {
    };

    class CPtr
    {
    public:
      CDerived* operator->(void) {return 0;};
    };

    int get_hello(CPtr ptr)
    {
      return ptr->hello();
    }

    class CPtrConst
    {
    public:
      const CDerived* operator->() const {return 0;};
    };
    
  }
  
%}

%extend hi::CBase {
  int foo(void) {return 1;};
  int bar(void) {return 2;};
  int boo(int i) {return i;};
}

%extend hi::CDerived {
  int foo(void) {return 1;};
}



%extend Foo
{
  int extension(int i, int j) { return i; }
  int extension(int i) { return i; }
  int extension() { return 1; }
}

%inline %{
  struct Foo {
  };
  
  class Bar {
    Foo *f;
  public:
    Bar(Foo *f) : f(f) { }
    Foo *operator->() {
      return f;
    }
  };
%}



%extend CFoo
{
public:
    static void StatFun() {};
    static void StatFun(int i) {};

    static void HoHoHo(int i, int j) {};
}

%inline %{

class CFoo
{
};

class CPtrFoo
{
public:
    CFoo* operator->(void) {return 0;};
};

%}



%inline %{
  namespace foo {
    
    class DFoo;
    
    class DPtrFoo
    {
      DFoo *p;
    public:
      DPtrFoo(DFoo *ptr) : p(ptr)
      {
      }
      
      DFoo* operator->(void) {return p;};
    };
    
    class DFoo
    {
    public:
      void F(void) {};
    };
  }
%}



%extend foo::DFoo {
  static int SExt(int i = 1) {return i;};
  int Ext(int i = 2) {return i;};
}
