<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -15,7 +15,7 @@ sub new {
 sub coupling {
   my ($self, $module) = @_;
   my %seen = ();
-  for my $caller_function (@{$self-&gt;model-&gt;modules-&gt;{$module}}) {
+  for my $caller_function ($self-&gt;model-&gt;functions($module)) {
     for my $called_function (keys(%{$self-&gt;model-&gt;calls-&gt;{$caller_function}})) {
       my $called_module = $self-&gt;model-&gt;members-&gt;{$called_function};
       next if $called_module &amp;&amp; ($called_module eq $module);
@@ -87,7 +87,8 @@ sub lcom4 {
 
 sub number_of_functions {
   my ($self, $module) = @_;
-  return (scalar $self-&gt;model-&gt;functions($module));
+  my $list = $self-&gt;model-&gt;functions($module);
+  return $list? scalar $list : 0;
 }
 
 sub amz_size {</diff>
      <filename>Egypt/Metrics.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,6 @@ use strict;
 sub new {
   my @defaults = (
     members =&gt; {},
-    types =&gt; {},
     modules =&gt; {},
     demangle =&gt; {},
     calls =&gt; {},
@@ -56,17 +55,8 @@ sub declare_member {
   # mapping member to module
   $self-&gt;{members}-&gt;{$member} = $module;
 
-  # mapping module to member
-  $self-&gt;{modules}-&gt;{$module} = [] if !exists($self-&gt;modules-&gt;{$module});
-  if (! grep { $_ eq $member } @{$self-&gt;modules-&gt;{$module}}) {
-    push @{$self-&gt;modules-&gt;{$module}}, $member;
-  }
-
   # demangling name
   $self-&gt;{demangle}-&gt;{$member} = $demangled_name;
-
-  # registering type of member
-  $self-&gt;{types}-&gt;{$member} = $type;
 }
 
 sub type {
@@ -77,11 +67,27 @@ sub type {
 sub declare_function {
   my ($self, $module, $function, $demangled_name) = @_;
   $self-&gt;declare_member($module, $function, $demangled_name, 'function');
+
+  if (!exists($self-&gt;{modules}-&gt;{$module})){
+    $self-&gt;{modules}-&gt;{$module} = {};
+    $self-&gt;{modules}-&gt;{$module}-&gt;{functions} = [];
+  }
+  if(! grep { $_ eq $function } @{$self-&gt;{modules}-&gt;{$module}-&gt;{functions}}){
+    push @{$self-&gt;{modules}-&gt;{$module}-&gt;{functions}}, $function;
+  }
 }
 
 sub declare_variable {
   my ($self, $module, $variable, $demangled_name) = @_;
   $self-&gt;declare_member($module, $variable, $demangled_name, 'variable');
+
+  if (!exists($self-&gt;{modules}-&gt;{$module})){
+    $self-&gt;{modules}-&gt;{$module} = {};
+    $self-&gt;{modules}-&gt;{$module}-&gt;{variables} = [];
+  }
+  if(! grep { $_ eq $variable } @{$self-&gt;{modules}-&gt;{$module}-&gt;{variables}}){
+    push @{$self-&gt;{modules}-&gt;{$module}-&gt;{variables}}, $variable;
+  }
 }
 
 sub demangle {
@@ -106,12 +112,6 @@ sub add_variable_use {
   add_call(@_, 'variable');
 }
 
-sub _find_by_type {
-  my ($self, $module, $type) = @_;
-  my @list = grep { $self-&gt;type($_) eq $type } @{$self-&gt;modules-&gt;{$module}};
-  return @list;
-}
-
 sub add_loc {
     my ($self, $function, $lines) = @_;
     $self-&gt;{lines}-&gt;{$function} = $lines;
@@ -123,13 +123,23 @@ sub add_protection {
 }
 
 sub functions {
-  _find_by_type(@_, 'function');
+  my ($self, $module) = @_;
+  my $list = $self-&gt;{modules}-&gt;{$module}-&gt;{functions};
+  return $list ? @$list : ();
 }
 
 sub variables {
-  _find_by_type(@_, 'variable');
+  my ($self, $module) = @_;
+  my $list = $self-&gt;{modules}-&gt;{$module}-&gt;{variables};
+  return $list ? @$list : ();
 }
 
+sub all_members {
+ my ($self, $module) = @_;
+ my @functions = $self-&gt;functions($module);
+ my @variables = $self-&gt;variables($module);
+ return @functions, @variables;
+}
 
 1;
 </diff>
      <filename>Egypt/Model.pm</filename>
    </modified>
    <modified>
      <diff>@@ -99,8 +99,8 @@ sub _calculate_clusters {
   foreach my $module (sort(keys(%{$self-&gt;model-&gt;modules}))) {
     $result .= &quot;subgraph \&quot;cluster_$module\&quot; {\n&quot;;
     $result .= sprintf(&quot;  label = \&quot;%s\&quot;;\n&quot;, _file_to_module($module));
-    foreach my $function (@{$self-&gt;model-&gt;modules-&gt;{$module}}) {
-      my $demangled = $self-&gt;_demangle($function);
+    foreach my $member ($self-&gt;model-&gt;all_members($module)) {
+      my $demangled = $self-&gt;_demangle($member);
       $result .= sprintf(&quot;  node [label=\&quot;%s\&quot;] \&quot;%s\&quot;;\n&quot;, $demangled, $demangled);
     }
     $result .= &quot;}\n&quot;;</diff>
      <filename>Egypt/Output/DOT.pm</filename>
    </modified>
    <modified>
      <diff>@@ -38,10 +38,17 @@ sub declaring_inheritance : Tests {
 sub declaring_function : Tests {
   my $model = new Egypt::Model;
   $model-&gt;declare_function('mymodule', 'myfunction');
+  $model-&gt;declare_function('mymodule', 'anotherfunction');
+
   ok((grep { $_ eq 'myfunction' } keys(%{$model-&gt;members})), &quot;declared function must be stored&quot;);
   is('mymodule', $model-&gt;members-&gt;{'myfunction'}, 'must map function to module');
   ok((grep { $_ eq 'mymodule'} keys(%{$model-&gt;modules})), 'declaring a function must declare its module');
-  ok((grep { $_ eq 'myfunction' } @{$model-&gt;modules-&gt;{'mymodule'}}), 'must store members in a module');
+  ok((grep { $_ eq 'myfunction' } @{$model-&gt;{modules}-&gt;{'mymodule'}-&gt;{functions}}), 'must store members in a module');
+
+  ok((grep { $_ eq 'anotherfunction' } keys(%{$model-&gt;members})), &quot;another declared function must be stored&quot;);
+  is('mymodule', $model-&gt;members-&gt;{'anotherfunction'}, 'must map another function to module');
+  ok((grep { $_ eq 'mymodule'} keys(%{$model-&gt;modules})), 'declaring a another function must declare its module');
+  ok((grep { $_ eq 'anotherfunction' } @{$model-&gt;{modules}-&gt;{'mymodule'}-&gt;{functions}}), 'must store members in a module');
 }
 
 sub declaring_function_with_demangled_name : Tests {
@@ -62,7 +69,7 @@ sub declaring_variables : Tests {
   ok((grep { $_ eq 'myvariable' } keys(%{$model-&gt;members})), &quot;declared variable must be stored&quot;);
   is('mymodule', $model-&gt;members-&gt;{'myvariable'}, 'must map variable to module');
   ok((grep { $_ eq 'mymodule'} keys(%{$model-&gt;modules})), 'declaring a variable must declare its module');
-  ok((grep { $_ eq 'myvariable' } @{$model-&gt;modules-&gt;{'mymodule'}}), 'must store variable in a module');
+  ok((grep { $_ eq 'myvariable' } @{$model-&gt;modules-&gt;{'mymodule'}-&gt;{variables}}), 'must store variable in a module');
 }
 
 sub adding_calls : Tests {
@@ -83,21 +90,36 @@ sub addding_variable_uses : Tests {
   is($model-&gt;calls-&gt;{'function1'}-&gt;{'variable9'}, 'variable', 'must register variable use');
 }
 
-sub querying_type_of_member_and_members_by_type : Tests {
+sub querying_variables : Tests {
   my $model = new Egypt::Model;
-  $model-&gt;declare_function('mod1', 'f1');
   $model-&gt;declare_variable('mod1', 'v1');
-  is($model-&gt;type('f1'), 'function');
-  is($model-&gt;type('v1'), 'variable');
+  $model-&gt;declare_variable('mod1', 'v2');
 
+  ok((grep { $_ eq 'v1' } $model-&gt;variables('mod1')), 'must list v1 in variables');
+  ok((grep { $_ eq 'v2' } $model-&gt;variables('mod1')), 'must list v2 in variables');
+}
+
+sub querying_functions : Tests {
+  my $model = new Egypt::Model;
+  $model-&gt;declare_function('mod1', 'f1');
   $model-&gt;declare_function('mod1', 'f2');
-  $model-&gt;declare_variable('mod1', 'v2');
 
   ok((grep { $_ eq 'f1' } $model-&gt;functions('mod1')), 'must list f1 in functions');
   ok((grep { $_ eq 'f2' } $model-&gt;functions('mod1')), 'must list f2 in functions');
-  ok((grep { $_ eq 'v1' } $model-&gt;variables('mod1')), 'must list v1 in variables');
-  ok((grep { $_ eq 'v2' } $model-&gt;variables('mod1')), 'must list v2 in variables');
+}
 
+sub querying_members : Tests {
+  my $model = new Egypt::Model;
+  $model-&gt;declare_function('mod1', 'f1');
+  $model-&gt;declare_variable('mod1', 'v1');
+
+  $model-&gt;declare_function('mod1', 'f2');
+  $model-&gt;declare_variable('mod1', 'v2');
+
+  ok((grep { $_ eq 'f1' } $model-&gt;all_members('mod1')), 'must list f1 in functions');
+  ok((grep { $_ eq 'f2' } $model-&gt;all_members('mod1')), 'must list f2 in functions');
+  ok((grep { $_ eq 'v1' } $model-&gt;all_members('mod1')), 'must list v1 in variables');
+  ok((grep { $_ eq 'v2' } $model-&gt;all_members('mod1')), 'must list v2 in variables');
 }
 
 sub declaring_protection : Tests {
@@ -113,3 +135,4 @@ sub declating_lines_of_code : Tests {
 }
 
 ModelTests-&gt;runtests;
+</diff>
      <filename>t/03_model.t</filename>
    </modified>
    <modified>
      <diff>@@ -40,16 +40,16 @@ sub inheritance : Tests {
 sub detect_function_declaration : Tests {
   my $extractor = Egypt::Extractor-&gt;load('Doxyparse', current_module =&gt; 'module1.c');
   $extractor-&gt;feed('   function myfunction in line 5');
-  ok(grep { $_ eq 'module1::myfunction' } @{$extractor-&gt;model-&gt;{modules}-&gt;{'module1.c'}});
+  ok(grep { $_ eq 'module1::myfunction' } @{$extractor-&gt;model-&gt;{modules}-&gt;{'module1.c'}-&gt;{functions}});
   is($extractor-&gt;current_member, 'module1::myfunction', 'must set the current function');
 }
 
 sub detect_variable_declaration : Tests {
   my $extractor = Egypt::Extractor-&gt;load('Doxyparse', current_module =&gt; 'module1.c');
   $extractor-&gt;feed('   variable myvariable in line 10');
-  ok(grep { $_ eq 'module1::myvariable' } @{$extractor-&gt;model-&gt;{modules}-&gt;{'module1.c'}});
+  ok(grep { $_ eq 'module1::myvariable' } @{$extractor-&gt;model-&gt;{modules}-&gt;{'module1.c'}-&gt;{variables}});
   $extractor-&gt;current_module; # only read the current module
-  is(scalar(grep { $_ eq 'module1::myvariable' } @{$extractor-&gt;model-&gt;{modules}-&gt;{'module1.c'}}), 1, 'must not read variable declarations when reading the name of the current module');
+  is(scalar(grep { $_ eq 'module1::myvariable' } @{$extractor-&gt;model-&gt;{modules}-&gt;{'module1.c'}-&gt;{variables}}), 1, 'must not read variable declarations when reading the name of the current module');
 }
 
 sub detect_direct_function_calls : Tests {
@@ -143,3 +143,4 @@ sub reading_from_directories : Tests {
 }
 
 ExtractorDoxyparseTests-&gt;runtests;
+</diff>
      <filename>t/06_extractor_doxyparse.t</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ef61cda280c0bf724ae9cee6fd3ffeff120a9d43</id>
    </parent>
  </parents>
  <author>
    <name>Jo&#227;o M. Miranda</name>
    <email>joaomm88@gmail.com</email>
  </author>
  <url>http://github.com/terceiro/egypt/commit/40e79055ca8e5ba2a8d72af2762c1dddcfec44c4</url>
  <id>40e79055ca8e5ba2a8d72af2762c1dddcfec44c4</id>
  <committed-date>2009-10-27T06:00:36-07:00</committed-date>
  <authored-date>2009-10-23T13:34:02-07:00</authored-date>
  <message>refactoring model: modules has lists of functions and variables (JoaoMM and PauloRMM)</message>
  <tree>56ab048d198e7bbaa0a23a119009c059b59ac80c</tree>
  <committer>
    <name>Antonio Terceiro</name>
    <email>terceiro@softwarelivre.org</email>
  </committer>
</commit>
