<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>DESIGN.txt</filename>
    </added>
    <added>
      <filename>__init__.py</filename>
    </added>
    <added>
      <filename>functional_test.py</filename>
    </added>
    <added>
      <filename>pysmell.py</filename>
    </added>
    <added>
      <filename>test.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,28 @@
-import sys
-import compiler
 from compiler import ast
 
+class ClassDict(object):
+    def __init__(self):
+        self._classes = {}
+
+    def addClass(self, klass):
+        self._classes[klass] = {}
+        self._classes[klass]['methods'] = []
+        self._classes[klass]['properties'] = []
+        self._classes[klass]['constructor'] = []
+
+    def addMethod(self, klass, method, args, docstring):
+        self._classes[klass]['methods'].append((method, args, docstring))
+
+    def addProperty(self, klass, prop):
+        self._classes[klass]['properties'].append(prop)
+
+    def setConstructor(self, klass, args):
+        self._classes[klass]['constructor'] = args
+
+    def __repr__(self):
+        return repr(self._classes)
+
+
 def VisitChildren(fun):
     def decorated(self, *args, **kwargs):
         fun(self, *args, **kwargs)
@@ -12,6 +33,8 @@ class CodeFinder(object):
     def __init__(self):
         self.scope = []
         self.checkers = {}
+        self.classes = ClassDict()
+        self.accesses = {}
 
     def addChecker(self, nodeType, func):
         self.checkers.setdefault(nodeType, []).append(func)
@@ -31,7 +54,7 @@ class CodeFinder(object):
         return self.inClass and self.scope[0].name or None
 
     OTHER = set(['Assign', 'AssName', 'Stmt', 'CallFunc', 'Const', 'Module',
-                 'Discard', 'Printnl'])
+                 'Discard', 'Printnl', 'Name', 'Return', 'Mod', 'Add'])
 
     def __getattr__(self, attr):
         if attr[5:] in self.OTHER:
@@ -41,54 +64,59 @@ class CodeFinder(object):
         for c in node.getChildNodes():
             self.visit(c)
 
-    @VisitChildren
-    def visitName(self, node):
-        print node.name
 
     @VisitChildren
     def visitGetattr(self, node):
-        print node.expr,
-        print node.attrname
+        if self.inClass:
+            if isinstance(node.expr, ast.Name):
+                if node.expr.name == 'self':
+                    print 'in class, self Accessing', node.attrname, 'of', self.currentClass
+            elif isinstance(node.expr, ast.CallFunc):
+                print 'in class, trying to access %s attr of %s' % (node.attrname, node.expr)
+            else:
+                print 'in class, Accessing', node.attrname, 'of', node.expr
+        else:
+            self.accesses.setdefault(node.expr.name, set([])).add(node.attrname)
+
+    @VisitChildren
+    def visitAssAttr(self, node):
+        if self.inClass:
+            if isinstance(node.expr, ast.Name):
+                if node.expr.name == 'self':
+                    self.classes.addProperty(self.currentClass, node.attrname)
+                    return
+        print 'assigning', node.expr, node.attrname
+
 
     def visitClass(self, klass):
         self.enterScope(klass)
-        print klass.name
+        self.classes.addClass(klass.name)
         self.visit(klass.code)
         self.exitScope()
 
-    @VisitChildren
     def visitFunction(self, func):
         for check in self.checkers.get('Function', []):
             check(self, func)
 
-source = &quot;&quot;&quot;
-class Aclass(object):
-    def do_stuff(salf):
-        a = 1
-        print a
-
-    def do_other_stuff():
-        self.bar().do_stuff()
-
-def test(aname):
-    aname.do_stuff()
-    aname.do_other_stuff()
-&quot;&quot;&quot;
-
-def self_argument(self, func):
-    if self.inClass:
-        if func.argnames:
-            if func.argnames[0] != 'self':
-                print ('self! in class %s, function %s, line %d' %
-                    (self.currentClass, func.name, func.lineno))
-        else:
-            print ('no args!')
-
-if __name__ == '__main__':
-    from compiler.visitor import ExampleASTVisitor
-    if len(sys.argv) &gt; 1:
-        source = open(sys.argv[1], 'r').read()
-    tree = compiler.parse(source)
-    codeFinder = CodeFinder()
-    codeFinder.addChecker('Function', self_argument)
-    compiler.walk(tree, codeFinder, walker=ExampleASTVisitor(), verbose=1)
+        self.accesses = {}
+        if self.inClass:
+            if func.name != '__init__':
+                if func.decorators and 'property' in [n.name for n in func.decorators]:
+                    self.classes.addProperty(self.currentClass, func.name)
+                else:
+                    self.classes.addMethod(self.currentClass, func.name, func.argnames[1:], func.doc or &quot;&quot;)
+            else:
+                self.classes.setConstructor(self.currentClass, func.argnames[1:])
+
+        self.visit(func.code)
+
+        for name, attrs in self.accesses.items():
+            for klass, classattrs in self.classes.items():
+                if attrs.issubset(classattrs):
+                    print name, 'looks like', klass
+
+
+
+
+            
+</diff>
      <filename>codefinder.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a28108e198be6b17054e28334602b22dbb47d1d1</id>
    </parent>
  </parents>
  <author>
    <name>Orestis Markou</name>
    <email>orestis@orestis.gr</email>
  </author>
  <url>http://github.com/orestis/pysmell/commit/b3fb05917ed1f13006b1a3c3e7b4814a53e4f439</url>
  <id>b3fb05917ed1f13006b1a3c3e7b4814a53e4f439</id>
  <committed-date>2008-08-25T14:41:51-07:00</committed-date>
  <authored-date>2008-08-25T14:41:51-07:00</authored-date>
  <message>Added functional test, design thoughts about how it should be.

Still have to add proper unit testing.</message>
  <tree>7e53d0f0280a9bd4014c26a68a5f7152351165e0</tree>
  <committer>
    <name>Orestis Markou</name>
    <email>orestis@orestis.gr</email>
  </committer>
</commit>
